cleanupd: restart as needed
authorRalph Boehme <slow@samba.org>
Tue, 19 Apr 2016 10:55:19 +0000 (12:55 +0200)
committerVolker Lendecke <vl@samba.org>
Tue, 19 Apr 2016 18:35:33 +0000 (20:35 +0200)
Bug: https://bugzilla.samba.org/show_bug.cgi?id=11855

Signed-off-by: Ralph Boehme <slow@samba.org>
Reviewed-by: Volker Lendecke <vl@samba.org>
Autobuild-User(master): Volker Lendecke <vl@samba.org>
Autobuild-Date(master): Tue Apr 19 20:35:33 CEST 2016 on sn-devel-144

source3/smbd/server.c

index 7e5b5d90dd8b206b12e6510c1b2fec8b80ef75d6..82e686e94c8bba8ec56ffa05ad1f3559ccc6b7c5 100644 (file)
@@ -468,6 +468,10 @@ static bool cleanupd_init(struct messaging_context *msg, bool interactive,
 
                DBG_DEBUG("Started cleanupd pid=%d\n", (int)pid);
 
+               if (am_parent != NULL) {
+                       add_child_pid(am_parent, pid);
+               }
+
                *ppid = pid_to_procid(pid);
                return true;
        }
@@ -557,16 +561,6 @@ static void remove_child_pid(struct smbd_parent_context *parent,
        struct iovec iov[2];
        NTSTATUS status;
 
-       iov[0] = (struct iovec) { .iov_base = (uint8_t *)&pid,
-                                 .iov_len = sizeof(pid) };
-       iov[1] = (struct iovec) { .iov_base = (uint8_t *)&unclean_shutdown,
-                                 .iov_len = sizeof(bool) };
-
-       status = messaging_send_iov(parent->msg_ctx, parent->cleanupd,
-                                   MSG_SMB_NOTIFY_CLEANUP,
-                                   iov, ARRAY_SIZE(iov), NULL, 0);
-       DEBUG(10, ("messaging_send_iov returned %s\n", nt_errstr(status)));
-
        for (child = parent->children; child != NULL; child = child->next) {
                if (child->pid == pid) {
                        struct smbd_child_pid *tmp = child;
@@ -583,6 +577,27 @@ static void remove_child_pid(struct smbd_parent_context *parent,
                return;
        }
 
+       if (child->pid == procid_to_pid(&parent->cleanupd)) {
+               bool ok;
+
+               DBG_WARNING("Restarting cleanupd\n");
+               ok = cleanupd_init(parent->msg_ctx, false, &parent->cleanupd);
+               if (!ok) {
+                       DBG_ERR("Failed to restart cleanupd\n");
+               }
+               return;
+       }
+
+       iov[0] = (struct iovec) { .iov_base = (uint8_t *)&pid,
+                                 .iov_len = sizeof(pid) };
+       iov[1] = (struct iovec) { .iov_base = (uint8_t *)&unclean_shutdown,
+                                 .iov_len = sizeof(bool) };
+
+       status = messaging_send_iov(parent->msg_ctx, parent->cleanupd,
+                                   MSG_SMB_NOTIFY_CLEANUP,
+                                   iov, ARRAY_SIZE(iov), NULL, 0);
+       DEBUG(10, ("messaging_send_iov returned %s\n", nt_errstr(status)));
+
        if (unclean_shutdown) {
                /* a child terminated uncleanly so tickle all
                   processes to see if they can grab any of the