Hello all,
I wanted to seek your opinion about correctness of the current behavior
of socket activated units.
Let's assume we have socket activated service (for example authd - auth.socket)
and
some other background service (for the purpose of this test called
authtest.service)
that needs to connect to the socket service to properly stop itself.
The authtest defines dependency on auth.socket as expected:
# cat /usr/lib/systemd/system/authtest.service
[Unit]
Description=Test Script to connect auth during shutdown
After=auth.socket
Requires=auth.socket
[Service]
ExecStart=/bin/true
ExecStop=/usr/bin/connect_authd
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Yet, authtest doesn't stop correctly (in our test case, the connection just
fails,
not real failure), because auth.socket refuses connections as soon as pending
job
on auth.socket is JOB_STOP, even if it's not yet time to really stop the unit.
The auth.socket:
May 16 11:23:41 pra0097 systemd[1]: Installed new job auth.socket/stop as 9395
May 16 11:23:41 pra0097 systemd[1]: Incoming traffic on auth.socket
May 16 11:23:41 pra0097 systemd[1]: Suppressing connection request on
auth.socket since unit stop is scheduled.
// NOTE the above
May 16 11:24:44 pra0097 systemd[1]: auth.socket changed listening -> dead
May 16 11:24:44 pra0097 systemd[1]: Job auth.socket/stop finished, result=done
May 16 11:24:44 pra0097 systemd[1]: Closed Authd Activation Socket.
May 16 11:24:44 pra0097 systemd[1]: Stopping Authd Activation Socket.
The authtest:
May 16 11:23:41 pra0097 systemd[1]: Installed new job authtest.service/stop as
9337
May 16 11:23:41 pra0097 systemd[1]: About to execute: /usr/bin/connect_authd
May 16 11:23:41 pra0097 systemd[1]: Forked /usr/bin/connect_authd as 7051
May 16 11:23:41 pra0097 systemd[1]: authtest.service changed exited -> stop
May 16 11:23:41 pra0097 systemd[1]: Stopping Test Script to connect auth during
shutdown...
May 16 11:23:41 pra0097 systemd[7051]: Executing: /usr/bin/connect_authd
May 16 11:23:41 pra0097 connect_authd[7051]: Tue May 16 11:23:41 CEST 2017
May 16 11:23:41 pra0097 connect_authd[7051]: COMMAND PID USER FD TYPE
DEVICE SIZE/OFF NODE NAME
May 16 11:23:41 pra0097 connect_authd[7051]: systemd 1 root 38u IPv6
19431 0t0 TCP *:auth (LISTEN)
May 16 11:23:41 pra0097 connect_authd[7051]: ERROR reading from socket:
Connection reset by peer
May 16 11:23:41 pra0097 connect_authd[7051]: sending message: 80,80
May 16 11:23:41 pra0097 systemd[1]: Child 7051 belongs to authtest.service
May 16 11:23:41 pra0097 systemd[1]: authtest.service: control process exited,
code=exited status=0
May 16 11:23:41 pra0097 systemd[1]: authtest.service got final SIGCHLD for
state stop
May 16 11:23:41 pra0097 systemd[1]: authtest.service changed stop -> dead
May 16 11:23:41 pra0097 systemd[1]: Job authtest.service/stop finished,
result=done
May 16 11:23:41 pra0097 systemd[1]: Stopped Test Script to connect auth during
shutdown.
May 16 11:23:41 pra0097 systemd[1]: authtest.service: cgroup is empty
The relevant piece of code:
static void socket_enter_running(Socket *s, int cfd) {
...
/* We don't take connections anymore if we are supposed to shut down
anyway */
if (unit_stop_pending(UNIT(s))) {
log_unit_debug(UNIT(s), "Suppressing connection request since unit
stop is scheduled.");
...
bool unit_stop_pending(Unit *u) {
...
return u->job && u->job->type == JOB_STOP;
}
Would not it make sense to still allow connections while the unit is still
running?
Or maybe for compatibility some boolean could be added to socket unit
definition to allow
the socket to keep answering connection until it really is stopped.
If it was not a socket activated unit the 2 services would order and work just
fine,
so why should socket unit be different?
Opinions?
Thanks!
StanM
_______________________________________________
systemd-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/systemd-devel