From 91ba8aec13f42c83190c5cecf4ec7e0e80d91dcc Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Wed, 17 Aug 2011 15:21:12 -0400 Subject: s3-prefork: Add parent->client messaging Signed-off-by: Andreas Schneider Signed-off-by: Simo Sorce --- source3/lib/server_prefork.c | 19 +++++++++++++++++++ source3/lib/server_prefork.h | 10 ++++++++++ source3/lib/server_prefork_util.c | 10 ++++++++++ 3 files changed, 39 insertions(+) (limited to 'source3') diff --git a/source3/lib/server_prefork.c b/source3/lib/server_prefork.c index 82645504f8..bcb5e0f19e 100644 --- a/source3/lib/server_prefork.c +++ b/source3/lib/server_prefork.c @@ -19,6 +19,8 @@ */ #include "includes.h" +#include "serverid.h" +#include "messages.h" #include "system/time.h" #include "system/shmem.h" #include "system/filesys.h" @@ -423,6 +425,23 @@ void prefork_send_signal_to_all(struct prefork_pool *pfp, int signal_num) } } +void prefork_warn_active_children(struct messaging_context *msg_ctx, + struct prefork_pool *pfp) +{ + const DATA_BLOB ping = data_blob_null; + int i; + + for (i = 0; i < pfp->pool_size; i++) { + if (pfp->pool[i].status == PF_WORKER_NONE) { + continue; + } + + messaging_send(msg_ctx, + pid_to_procid(pfp->pool[i].pid), + MSG_PREFORK_PARENT_EVENT, &ping); + } +} + static void prefork_sigchld_handler(struct tevent_context *ev_ctx, struct tevent_signal *se, int signum, int count, diff --git a/source3/lib/server_prefork.h b/source3/lib/server_prefork.h index d240641a39..17491536ff 100644 --- a/source3/lib/server_prefork.h +++ b/source3/lib/server_prefork.h @@ -225,6 +225,16 @@ void prefork_reset_allowed_clients(struct prefork_pool *pfp); */ void prefork_send_signal_to_all(struct prefork_pool *pfp, int signal_num); +/** +* @brief Send a message to all children that the server changed something +* in the pool and they may want to take action. +* +* @param msg_ctx The messaging context. +* @param pfp The pool. +*/ +void prefork_warn_active_children(struct messaging_context *msg_ctx, + struct prefork_pool *pfp); + /** * @brief Sets the SIGCHLD callback * diff --git a/source3/lib/server_prefork_util.c b/source3/lib/server_prefork_util.c index 638ce66f09..01c7994f60 100644 --- a/source3/lib/server_prefork_util.c +++ b/source3/lib/server_prefork_util.c @@ -67,6 +67,7 @@ void pfh_manage_pool(struct tevent_context *ev_ctx, time_t now = time(NULL); int total, avail; int ret, n; + bool msg = false; if ((cfg->prefork_status & PFH_NEW_MAX) && !(cfg->prefork_status & PFH_ENOSPC)) { @@ -119,6 +120,7 @@ void pfh_manage_pool(struct tevent_context *ev_ctx, if (n == avail) break; n = avail; } + msg = true; } else if (avail > total + cfg->spawn_rate) { n = avail; while (avail > total + cfg->spawn_rate) { @@ -130,6 +132,14 @@ void pfh_manage_pool(struct tevent_context *ev_ctx, } } + /* send message to all children when we change maximum allowed + * connections, so that they can decide to start again to listen to + * sockets if they were already topping the number of allowed + * clients. Useful only when we increase allowed clients */ + if (msg) { + prefork_warn_active_children(msg_ctx, pool); + } + DEBUG(10, ("Stats: children: %d, allowed connections: %d\n", prefork_count_children(pool, NULL), prefork_count_allowed_connections(pool))); -- cgit