s3-prefork: Add parent->client messaging
authorSimo Sorce <idra@samba.org>
Wed, 17 Aug 2011 19:21:12 +0000 (15:21 -0400)
committerSimo Sorce <idra@samba.org>
Sun, 21 Aug 2011 13:05:06 +0000 (09:05 -0400)
Signed-off-by: Andreas Schneider <asn@samba.org>
Signed-off-by: Simo Sorce <idra@samba.org>
source3/lib/server_prefork.c
source3/lib/server_prefork.h
source3/lib/server_prefork_util.c

index 82645504f8e237ced82e0b2f4e206cc3bba69a63..bcb5e0f19e8858b8935af70d7a401f687495191f 100644 (file)
@@ -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,
index d240641a39325d211cedd4d13e6fcfb5ffad1e05..17491536ffbe93b46eabc281aace46ab028e4077 100644 (file)
@@ -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
 *
index 638ce66f094bc0b3696541035e6e67475b104a51..01c7994f601611c5096a8447be1c7b1a1f807d68 100644 (file)
@@ -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)));