summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimo Sorce <idra@samba.org>2011-08-17 15:21:12 -0400
committerSimo Sorce <idra@samba.org>2011-08-21 09:05:06 -0400
commit91ba8aec13f42c83190c5cecf4ec7e0e80d91dcc (patch)
treebda18b735ad2ee2fcbdf0592096084d45e38db8c
parent98d2bf052e214580a3ca3146b10688c9e1c7bc78 (diff)
downloadsamba-91ba8aec13f42c83190c5cecf4ec7e0e80d91dcc.tar.gz
samba-91ba8aec13f42c83190c5cecf4ec7e0e80d91dcc.tar.bz2
samba-91ba8aec13f42c83190c5cecf4ec7e0e80d91dcc.zip
s3-prefork: Add parent->client messaging
Signed-off-by: Andreas Schneider <asn@samba.org> Signed-off-by: Simo Sorce <idra@samba.org>
-rw-r--r--source3/lib/server_prefork.c19
-rw-r--r--source3/lib/server_prefork.h10
-rw-r--r--source3/lib/server_prefork_util.c10
3 files changed, 39 insertions, 0 deletions
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
@@ -226,6 +226,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
*
* @param pfp The pool handler.
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)));