source4 smbd: pass instance number to post_fork
authorGary Lockyer <gary@catalyst.net.nz>
Wed, 29 Aug 2018 01:16:08 +0000 (13:16 +1200)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 7 Nov 2018 16:55:09 +0000 (17:55 +0100)
Pass the instance number to the post_fork hook. This is required to
allow the rpc_server to support the prefork process model.

Signed-off-by: Gary Lockyer <gary@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
source4/kdc/kdc-heimdal.c
source4/smbd/process_prefork.c
source4/smbd/process_single.c
source4/smbd/process_standard.c
source4/smbd/service.h

index 407de92054e701ce6b8f1cf1f85c11af7cc5dabd..67c07c3d81a5e9dfe9ec0f33bf7c14ab7181b075 100644 (file)
@@ -316,7 +316,7 @@ static NTSTATUS kdc_task_init(struct task_server *task)
 /*
   initialise the kdc task after a fork
 */
-static void kdc_post_fork(struct task_server *task)
+static void kdc_post_fork(struct task_server *task, struct process_details *pd)
 {
        struct kdc_server *kdc;
        krb5_kdc_configuration *kdc_config = NULL;
index 788aa976390dc2523c2ea8678b39bb62acd257e1..016385c762c2836ba4ce1d481ce6279575cf0644 100644 (file)
@@ -240,6 +240,7 @@ static void prefork_new_task(
 
        struct tevent_context *ev2;
        struct task_server *task = NULL;
+       struct process_details pd = initial_process_details;
 
        t = tfork_create();
        if (t == NULL) {
@@ -284,7 +285,7 @@ static void prefork_new_task(
                 * The task does not support pre-fork
                 */
                if (task != NULL && service_details->post_fork != NULL) {
-                       service_details->post_fork(task);
+                       service_details->post_fork(task, &pd);
                }
                tevent_loop_wait(ev);
                TALLOC_FREE(ev);
@@ -348,6 +349,7 @@ static void prefork_new_task(
                                          "after fork");
                        }
                        tevent_fd_set_auto_close(fde);
+                       pd.instances++;
                } else {
                        /*
                         * tfork uses malloc
@@ -355,12 +357,13 @@ static void prefork_new_task(
                        free(w);
 
                        TALLOC_FREE(ev);
-                       setproctitle("task[%s] pre-forked worker",
-                                    service_name);
+                       setproctitle("task[%s] pre-forked worker(%d)",
+                                    service_name,
+                                    pd.instances);
                        prefork_reload_after_fork();
                        setup_handlers(ev2, from_parent_fd);
                        if (service_details->post_fork != NULL) {
-                               service_details->post_fork(task);
+                               service_details->post_fork(task, &pd);
                        }
                        tevent_loop_wait(ev2);
                        talloc_free(ev2);
index 242622b3b8fc7d071f3ea7240646b130445608d6..174c15728125d3ab034a0cfbd546031891ec5489 100644 (file)
@@ -114,7 +114,8 @@ static void single_new_task(struct tevent_context *ev,
         */
        task = new_task(ev, lp_ctx, cluster_id(pid, taskid++), private_data, NULL);
        if (task != NULL && service_details->post_fork != NULL) {
-               service_details->post_fork(task);
+               struct process_details pd = initial_process_details;
+               service_details->post_fork(task, &pd);
        }
 }
 
index 62620096af526e1f4b849cd1338ae347c4ed8058..91dfa9753c5494e7d87f781a41feb6f7c4ce220e 100644 (file)
@@ -494,7 +494,8 @@ static void standard_new_task(struct tevent_context *ev,
         * is forked in standard_accept_connection.
         */
        if (task != NULL && service_details->post_fork != NULL) {
-               service_details->post_fork(task);
+               struct process_details pd = initial_process_details;
+               service_details->post_fork(task, &pd);
        }
 
 
index 467cb34f6ca63d7af8def29c0b6a4e7d82c720a9..0b6f937b63ceb5221787b4a763818b49e26a1d90 100644 (file)
 #include "smbd/service_stream.h"
 #include "smbd/service_task.h"
 
+struct process_details {
+       unsigned int instances;
+};
+
+static const struct process_details initial_process_details = {
+       .instances = 0
+};
+
 struct service_details {
        /*
         * Prevent the standard process model from forking a new worker
@@ -64,7 +72,7 @@ struct service_details {
         *   process is forked on a new connection. It is instead called
         *   immediately after the task_init.
         */
-       void (*post_fork) (struct task_server *);
+       void (*post_fork) (struct task_server *, struct process_details *);
 };
 
 #include "smbd/service_proto.h"