diff options
| -rw-r--r-- | source3/lib/server_prefork.c | 19 | ||||
| -rw-r--r-- | source3/lib/server_prefork.h | 10 | ||||
| -rw-r--r-- | source3/lib/server_prefork_util.c | 10 | 
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)));  | 
