[systemd-devel] [PATCH] core: support Distribute=n to distribute to n workers
Lennart Poettering
lennart at poettering.net
Wed Dec 11 06:10:01 PST 2013
On Tue, 10.12.13 18:53, Shawn Landden (shawn at churchofgit.com) wrote:
> @@ -116,6 +115,7 @@ const sd_bus_vtable bus_socket_vtable[] = {
> SD_BUS_PROPERTY("MessageQueueMessageSize", "x", bus_property_get_long, offsetof(Socket, mq_msgsize), 0),
> SD_BUS_PROPERTY("Result", "s", property_get_result, offsetof(Socket, result), SD_BUS_VTABLE_PROPERTY_EMITS_CHANGE),
> SD_BUS_PROPERTY("ReusePort", "b", bus_property_get_bool,
> offsetof(Socket, reuse_port), 0),
Did you turn reuseport into a tristate as suggested? If so, then
bus_property_get_bool needs to become bus_property_get_tristate here so
that the right type is serialized to dbus.
> +Socket.ReusePort, config_parse_bool, -1, offsetof(Socket, reuse_port)
Similar here... (and what's the -1?)
As it turns out I recently removed config_parse_tristate() as part of
9588bc32096fc8342bfd8b989689717186d7d86e. You should probably restore
that function from that commit to make use of it here...
> + Socket *socket = SOCKET(UNIT_DEREF(s->accept_socket));
> log_debug_unit(u->id,
> "%s: got READY=1", u->id);
>
> + if (socket && socket->distribute > socket->n_connections)
> + socket_enter_listening(socket);
> +
Hmm, I would prefer if we wouldn't reach over too much into the socket
here, i.e. handle this within socket_trigger_notify(). That function is
always called when a unit that is triggered by the socket changes state.
> + if (s->reuse_port == -1) {
I'd prefer not checking against specific values,but really just if <
0, > 0, or == 0. Checking against specific values would kinda suggest
that there are more than three values.
if (s->reuse_port < 0) ...
Also, please do this part as part of socket_load() somewhere, so that
the < 0 state is turned into > 0 or == 0 already when loading the unit.
> - if (cfd < 0) {
> + if (cfd < 0 && !(s->distribute)) {
The extra ()... Also, please use == 0 here since it is a number...
(Same fix at a few other places...)
> + if (s->distribute > 0 && (s->n_connections >= s->distribute || SERVICE(UNIT_DEREF(s->service))->type == SERVICE_NOTIFY))
> + socket_set_state(s, SOCKET_RUNNING);
> +
Why do you check for SERVICE_NOTIFY here?
Also, maybe I missed something, but if SO_REUSEPORT is used you need to
create a new socket for each connection and bind it to the same
address. You have to duplicate the existing socket, but not with dup(),
but instead by creating a new one with the same parameters and with
SO_REUSEPORT... The first instance this spawns should get the original
socket though, but all others should get one of these copies...
Lennart
--
Lennart Poettering, Red Hat
More information about the systemd-devel
mailing list