diff options
author | Simo Sorce <idra@samba.org> | 2011-08-12 15:24:17 -0400 |
---|---|---|
committer | Simo Sorce <idra@samba.org> | 2011-08-21 09:05:04 -0400 |
commit | 3451f423d6a70da054c06135bc36daf0677b53f9 (patch) | |
tree | e312bddd5e11ff55a74624a213ccafd205325ce1 /source3/lib | |
parent | 0647a93c64ce5d87527d6c9e34688f93e7cd03b3 (diff) | |
download | samba-3451f423d6a70da054c06135bc36daf0677b53f9.tar.gz samba-3451f423d6a70da054c06135bc36daf0677b53f9.tar.bz2 samba-3451f423d6a70da054c06135bc36daf0677b53f9.zip |
s3-prefork: Add common utilities for daemons
Daemons using the prefork infrastructure may want to use these utils to
configure and manage a pool of children.
Signed-off-by: Andreas Schneider <asn@samba.org>
Signed-off-by: Simo Sorce <idra@samba.org>
Diffstat (limited to 'source3/lib')
-rw-r--r-- | source3/lib/server_prefork_util.c | 117 | ||||
-rw-r--r-- | source3/lib/server_prefork_util.h | 49 |
2 files changed, 166 insertions, 0 deletions
diff --git a/source3/lib/server_prefork_util.c b/source3/lib/server_prefork_util.c new file mode 100644 index 0000000000..6b1e249335 --- /dev/null +++ b/source3/lib/server_prefork_util.c @@ -0,0 +1,117 @@ +/* + Unix SMB/Netbios implementation. + Prefork Helpers + Copyright (C) Simo Sorce <idra@samba.org> 2011 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "includes.h" +#include "lib/server_prefork.h" +#include "lib/server_prefork_util.h" + +void pfh_daemon_config(const char *daemon_name, + struct pf_daemon_config *cfg, + struct pf_daemon_config *default_cfg) +{ + int min, max, rate, allow, life; + + min = lp_parm_int(GLOBAL_SECTION_SNUM, + daemon_name, + "prefork_min_children", + default_cfg->min_children); + max = lp_parm_int(GLOBAL_SECTION_SNUM, + daemon_name, + "prefork_max_children", + default_cfg->max_children); + rate = lp_parm_int(GLOBAL_SECTION_SNUM, + daemon_name, + "prefork_spawn_rate", + default_cfg->spawn_rate); + allow = lp_parm_int(GLOBAL_SECTION_SNUM, + daemon_name, + "prefork_max_allowed_clients", + default_cfg->max_allowed_clients); + life = lp_parm_int(GLOBAL_SECTION_SNUM, + daemon_name, + "prefork_child_min_life", + default_cfg->child_min_life); + + if (max > cfg->max_children && cfg->max_children != 0) { + cfg->prefork_status |= PFH_NEW_MAX; + } + + cfg->min_children = min; + cfg->max_children = max; + cfg->spawn_rate = rate; + cfg->max_allowed_clients = allow; + cfg->child_min_life = life; +} + +void pfh_manage_pool(struct tevent_context *ev_ctx, + struct messaging_context *msg_ctx, + struct pf_daemon_config *cfg, + struct prefork_pool *pool) +{ + time_t now = time(NULL); + int active, total; + int ret, n; + + if ((cfg->prefork_status & PFH_NEW_MAX) && + !(cfg->prefork_status & PFH_ENOSPC)) { + ret = prefork_expand_pool(pool, cfg->max_children); + if (ret == ENOSPC) { + cfg->prefork_status |= PFH_ENOSPC; + } + cfg->prefork_status &= ~PFH_NEW_MAX; + } + + active = prefork_count_active_children(pool, &total); + + if ((total < cfg->max_children) && + ((total < cfg->min_children) || + (total - active < cfg->spawn_rate))) { + n = prefork_add_children(ev_ctx, msg_ctx, + pool, cfg->spawn_rate); + if (n < cfg->spawn_rate) { + DEBUG(10, ("Tried to start %d children but only," + "%d were actually started.!\n", + cfg->spawn_rate, n)); + } + } + + if (total - active > cfg->min_children) { + if ((total - cfg->min_children) >= cfg->spawn_rate) { + prefork_retire_children(pool, cfg->spawn_rate, + now - cfg->child_min_life); + } + } + + n = prefork_count_allowed_connections(pool); + if (n <= cfg->spawn_rate) { + do { + prefork_increase_allowed_clients(pool, + cfg->max_allowed_clients); + n = prefork_count_allowed_connections(pool); + } while (n <= cfg->spawn_rate); + } else if (n > cfg->max_children + cfg->spawn_rate) { + do { + prefork_decrease_allowed_clients(pool); + n = prefork_count_allowed_connections(pool); + } while (n > cfg->max_children + cfg->spawn_rate); + } + + DEBUG(10, ("Stats: children: %d, allowed connections: %d\n", + total, prefork_count_allowed_connections(pool))); +} diff --git a/source3/lib/server_prefork_util.h b/source3/lib/server_prefork_util.h new file mode 100644 index 0000000000..5715f06f4a --- /dev/null +++ b/source3/lib/server_prefork_util.h @@ -0,0 +1,49 @@ +/* + Unix SMB/CIFS implementation. + Prefork Helpers. + + Copyright (C) Simo Sorce <idra@samba.org> 2011 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef _SERVER_PREFORK_UTIL_H_ +#define _SERVER_PREFORK_UTIL_H_ + +struct tevent_context; +struct messaging_context; + +#define PFH_INIT 0x00 +#define PFH_NEW_MAX 0x01 +#define PFH_ENOSPC 0x02 + +struct pf_daemon_config { + int prefork_status; + int min_children; + int max_children; + int spawn_rate; + int max_allowed_clients; + int child_min_life; +}; + +void pfh_daemon_config(const char *daemon_name, + struct pf_daemon_config *cfg, + struct pf_daemon_config *default_cfg); + +void pfh_manage_pool(struct tevent_context *ev_ctx, + struct messaging_context *msg_ctx, + struct pf_daemon_config *cfg, + struct prefork_pool *pool); + +#endif /* _SERVER_PREFORK_UTIL_H_ */ |