Director and anvil services are by default never killed.
This also fixes the errors about idling director process not dying.
--HG--
branch : HEAD
.process_limit = 1,
.client_limit = 0,
.service_count = 0,
+ .idle_kill = -1U,
.vsz_limit = -1U,
.unix_listeners = { { &anvil_unix_listeners_buf,
.process_limit = 1,
.client_limit = 4096,
.service_count = 0,
+ .idle_kill = 0,
.vsz_limit = -1U,
.unix_listeners = { { &auth_unix_listeners_buf,
.process_limit = 0,
.client_limit = 1,
.service_count = 1,
+ .idle_kill = 0,
.vsz_limit = -1U,
.unix_listeners = { { &auth_worker_unix_listeners_buf,
.process_limit = 0,
.client_limit = 0,
.service_count = 0,
+ .idle_kill = 0,
.vsz_limit = -1U,
.unix_listeners = { { &config_unix_listeners_buf,
.process_limit = 0,
.client_limit = 1,
.service_count = 0,
+ .idle_kill = 0,
.vsz_limit = -1U,
.unix_listeners = { { &dict_unix_listeners_buf,
.process_limit = 1,
.client_limit = 0,
.service_count = 0,
+ .idle_kill = -1U,
.vsz_limit = -1U,
.unix_listeners = { { &director_unix_listeners_buf,
.process_limit = 0,
.client_limit = 1,
.service_count = 0,
+ .idle_kill = 0,
.vsz_limit = -1U,
.unix_listeners = { { &dns_client_unix_listeners_buf,
.process_limit = 0,
.client_limit = 0,
.service_count = 1,
+ .idle_kill = 0,
.vsz_limit = 64,
.unix_listeners = ARRAY_INIT,
.process_limit = 1024,
.client_limit = 1,
.service_count = 1,
+ .idle_kill = 0,
.vsz_limit = -1U,
.unix_listeners = { { &imap_unix_listeners_buf,
unsigned int process_limit;
unsigned int client_limit;
unsigned int service_count;
+ unsigned int idle_kill;
uoff_t vsz_limit;
ARRAY_TYPE(file_listener_settings) unix_listeners;
.process_limit = 0,
.client_limit = 0,
.service_count = 0,
+ .idle_kill = 0,
.vsz_limit = 0,
.unix_listeners = { { &lmtp_login_unix_listeners_buf,
.process_limit = 1,
.client_limit = 0,
.service_count = 0,
+ .idle_kill = 0,
.vsz_limit = -1U,
.unix_listeners = ARRAY_INIT,
DEF(SET_UINT, process_limit),
DEF(SET_UINT, client_limit),
DEF(SET_UINT, service_count),
+ DEF(SET_TIME, idle_kill),
DEF(SET_SIZE, vsz_limit),
DEFLIST_UNIQUE(unix_listeners, "unix_listener",
.process_limit = -1U,
.client_limit = 0,
.service_count = 0,
+ .idle_kill = 0,
.vsz_limit = (uoff_t)-1,
.unix_listeners = ARRAY_INIT,
DEF(SET_STR, default_login_user),
DEF(SET_UINT, default_process_limit),
DEF(SET_UINT, default_client_limit),
+ DEF(SET_UINT, default_idle_kill),
DEF(SET_SIZE, default_vsz_limit),
DEF(SET_BOOL, version_ignore),
.default_login_user = "dovenull",
.default_process_limit = 100,
.default_client_limit = 1000,
+ .default_idle_kill = 60,
.default_vsz_limit = 256*1024*1024,
.version_ignore = FALSE,
const char *default_login_user;
unsigned int default_process_limit;
unsigned int default_client_limit;
+ unsigned int default_idle_kill;
uoff_t default_vsz_limit;
bool version_ignore;
#include <syslog.h>
#include <signal.h>
-#define SERVICE_PROCESS_KILL_IDLE_MSECS (1000*60)
#define SERVICE_STARTUP_FAILURE_THROTTLE_SECS 60
#define SERVICE_DROP_WARN_INTERVAL_SECS 60
process->idle_start = ioloop_time;
if (service->process_avail > service->set->process_min_avail &&
process->to_idle == NULL &&
- service->type != SERVICE_TYPE_ANVIL) {
+ service->idle_kill != -1U) {
/* we have more processes than we really need.
add a bit of randomness so that we don't send the
signal to all of them at once */
process->to_idle =
- timeout_add(SERVICE_PROCESS_KILL_IDLE_MSECS +
+ timeout_add((service->set->idle_kill * 1000) +
(rand() % 100)*10,
service_process_kill_idle,
process);
service->vsz_limit = set->vsz_limit != (uoff_t)-1 ? set->vsz_limit :
set->master_set->default_vsz_limit;
+ service->idle_kill = set->idle_kill != 0 ? set->idle_kill :
+ set->master_set->default_idle_kill;
service->type = service->set->parsed_type;
if (set->process_limit == 0) {
/* Maximum number of client connections a process can handle. */
unsigned int client_limit;
+ /* Kill idling processes after this many seconds. */
+ unsigned int idle_kill;
/* set->vsz_limit or set->master_set->default_client_limit */
uoff_t vsz_limit;
.process_limit = 0,
.client_limit = 0,
.service_count = 1,
+ .idle_kill = 0,
.vsz_limit = 64,
.unix_listeners = ARRAY_INIT,
.process_limit = 1024,
.client_limit = 1,
.service_count = 1,
+ .idle_kill = 0,
.vsz_limit = -1U,
.unix_listeners = { { &pop3_unix_listeners_buf,
.process_limit = 0,
.client_limit = 0,
.service_count = 0,
+ .idle_kill = 0,
.vsz_limit = -1U,
.unix_listeners = { { &ssl_params_unix_listeners_buf,
.process_limit = 0,
.client_limit = 1,
.service_count = 0,
+ .idle_kill = 0,
.vsz_limit = -1U,
.unix_listeners = ARRAY_INIT,