]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core/socket: don't consider service active when in SERVICE_AUTO_RESTART_QUEUED
authorMike Yuan <me@yhndnzj.com>
Thu, 17 Aug 2023 15:37:01 +0000 (23:37 +0800)
committerLuca Boccassi <luca.boccassi@gmail.com>
Fri, 18 Aug 2023 08:24:27 +0000 (09:24 +0100)
Follow-up for 09d04ad325473e05e23e6ba8382d7de1dd819bda

Fixes #28856

src/core/socket.c

index 74d77692819591ee395d42d1dd74bd9250f4e37d..8b40f6b97637d7538dbe37441ca2144eeb88fbac 100644 (file)
@@ -2487,12 +2487,16 @@ static int socket_start(Unit *u) {
                 service = SERVICE(UNIT_DEREF(s->service));
 
                 if (UNIT(service)->load_state != UNIT_LOADED)
-                        return log_unit_error_errno(u, SYNTHETIC_ERRNO(ENOENT), "Socket service %s not loaded, refusing.", UNIT(service)->id);
+                        return log_unit_error_errno(u, SYNTHETIC_ERRNO(ENOENT),
+                                                    "Socket service %s not loaded, refusing.", UNIT(service)->id);
 
                 /* If the service is already active we cannot start the
                  * socket */
-                if (!IN_SET(service->state, SERVICE_DEAD, SERVICE_FAILED, SERVICE_DEAD_BEFORE_AUTO_RESTART, SERVICE_FAILED_BEFORE_AUTO_RESTART, SERVICE_AUTO_RESTART))
-                        return log_unit_error_errno(u, SYNTHETIC_ERRNO(EBUSY), "Socket service %s already active, refusing.", UNIT(service)->id);
+                if (!IN_SET(service->state,
+                            SERVICE_DEAD, SERVICE_DEAD_BEFORE_AUTO_RESTART, SERVICE_FAILED, SERVICE_FAILED_BEFORE_AUTO_RESTART,
+                            SERVICE_AUTO_RESTART, SERVICE_AUTO_RESTART_QUEUED))
+                        return log_unit_error_errno(u, SYNTHETIC_ERRNO(EBUSY),
+                                                    "Socket service %s already active, refusing.", UNIT(service)->id);
         }
 
         assert(IN_SET(s->state, SOCKET_DEAD, SOCKET_FAILED));
@@ -3356,7 +3360,7 @@ static void socket_trigger_notify(Unit *u, Unit *other) {
         if (IN_SET(SERVICE(other)->state,
                    SERVICE_DEAD, SERVICE_DEAD_BEFORE_AUTO_RESTART, SERVICE_FAILED, SERVICE_FAILED_BEFORE_AUTO_RESTART,
                    SERVICE_FINAL_SIGTERM, SERVICE_FINAL_SIGKILL,
-                   SERVICE_AUTO_RESTART))
+                   SERVICE_AUTO_RESTART, SERVICE_AUTO_RESTART_QUEUED))
                socket_enter_listening(s);
 
         if (SERVICE(other)->state == SERVICE_RUNNING)