From: Timo Sirainen Date: Fri, 25 Jun 2010 13:03:20 +0000 (+0100) Subject: Added support for per-service idle kill timeout. X-Git-Tag: 2.0.rc1~87 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=93a7d1ee4b518b5c85f9721dc6539e4dab6aae00;p=thirdparty%2Fdovecot%2Fcore.git Added support for per-service idle kill timeout. Director and anvil services are by default never killed. This also fixes the errors about idling director process not dying. --HG-- branch : HEAD --- diff --git a/src/anvil/anvil-settings.c b/src/anvil/anvil-settings.c index f28d6b7186..04e2d96937 100644 --- a/src/anvil/anvil-settings.c +++ b/src/anvil/anvil-settings.c @@ -38,6 +38,7 @@ struct service_settings anvil_service_settings = { .process_limit = 1, .client_limit = 0, .service_count = 0, + .idle_kill = -1U, .vsz_limit = -1U, .unix_listeners = { { &anvil_unix_listeners_buf, diff --git a/src/auth/auth-settings.c b/src/auth/auth-settings.c index 5fd66b24c2..d492e11c1e 100644 --- a/src/auth/auth-settings.c +++ b/src/auth/auth-settings.c @@ -51,6 +51,7 @@ struct service_settings auth_service_settings = { .process_limit = 1, .client_limit = 4096, .service_count = 0, + .idle_kill = 0, .vsz_limit = -1U, .unix_listeners = { { &auth_unix_listeners_buf, @@ -88,6 +89,7 @@ struct service_settings auth_worker_service_settings = { .process_limit = 0, .client_limit = 1, .service_count = 1, + .idle_kill = 0, .vsz_limit = -1U, .unix_listeners = { { &auth_worker_unix_listeners_buf, diff --git a/src/config/config-settings.c b/src/config/config-settings.c index 7c246d4350..cd6964b674 100644 --- a/src/config/config-settings.c +++ b/src/config/config-settings.c @@ -36,6 +36,7 @@ struct service_settings config_service_settings = { .process_limit = 0, .client_limit = 0, .service_count = 0, + .idle_kill = 0, .vsz_limit = -1U, .unix_listeners = { { &config_unix_listeners_buf, diff --git a/src/dict/dict-settings.c b/src/dict/dict-settings.c index c83f457748..0e3e675b56 100644 --- a/src/dict/dict-settings.c +++ b/src/dict/dict-settings.c @@ -35,6 +35,7 @@ struct service_settings dict_service_settings = { .process_limit = 0, .client_limit = 1, .service_count = 0, + .idle_kill = 0, .vsz_limit = -1U, .unix_listeners = { { &dict_unix_listeners_buf, diff --git a/src/director/director-settings.c b/src/director/director-settings.c index 3af1ef6ccf..d295ce05ec 100644 --- a/src/director/director-settings.c +++ b/src/director/director-settings.c @@ -48,6 +48,7 @@ struct service_settings director_service_settings = { .process_limit = 1, .client_limit = 0, .service_count = 0, + .idle_kill = -1U, .vsz_limit = -1U, .unix_listeners = { { &director_unix_listeners_buf, diff --git a/src/dns/dns-client-settings.c b/src/dns/dns-client-settings.c index 89db9c0018..c56f770c23 100644 --- a/src/dns/dns-client-settings.c +++ b/src/dns/dns-client-settings.c @@ -38,6 +38,7 @@ struct service_settings dns_client_service_settings = { .process_limit = 0, .client_limit = 1, .service_count = 0, + .idle_kill = 0, .vsz_limit = -1U, .unix_listeners = { { &dns_client_unix_listeners_buf, diff --git a/src/imap-login/imap-login-settings.c b/src/imap-login/imap-login-settings.c index d1469608e1..3672fb4d66 100644 --- a/src/imap-login/imap-login-settings.c +++ b/src/imap-login/imap-login-settings.c @@ -40,6 +40,7 @@ struct service_settings imap_login_service_settings = { .process_limit = 0, .client_limit = 0, .service_count = 1, + .idle_kill = 0, .vsz_limit = 64, .unix_listeners = ARRAY_INIT, diff --git a/src/imap/imap-settings.c b/src/imap/imap-settings.c index 93167d3f57..103f9e9abc 100644 --- a/src/imap/imap-settings.c +++ b/src/imap/imap-settings.c @@ -43,6 +43,7 @@ struct service_settings imap_service_settings = { .process_limit = 1024, .client_limit = 1, .service_count = 1, + .idle_kill = 0, .vsz_limit = -1U, .unix_listeners = { { &imap_unix_listeners_buf, diff --git a/src/lib-master/service-settings.h b/src/lib-master/service-settings.h index 35dbfc392a..45cb7e1f09 100644 --- a/src/lib-master/service-settings.h +++ b/src/lib-master/service-settings.h @@ -44,6 +44,7 @@ struct service_settings { 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; diff --git a/src/lmtp/lmtp-settings.c b/src/lmtp/lmtp-settings.c index ad9f3d49a9..323322fa1a 100644 --- a/src/lmtp/lmtp-settings.c +++ b/src/lmtp/lmtp-settings.c @@ -41,6 +41,7 @@ struct service_settings lmtp_login_service_settings = { .process_limit = 0, .client_limit = 0, .service_count = 0, + .idle_kill = 0, .vsz_limit = 0, .unix_listeners = { { &lmtp_login_unix_listeners_buf, diff --git a/src/log/log-settings.c b/src/log/log-settings.c index 1dd6b21c3c..3ddb25e510 100644 --- a/src/log/log-settings.c +++ b/src/log/log-settings.c @@ -23,6 +23,7 @@ struct service_settings log_service_settings = { .process_limit = 1, .client_limit = 0, .service_count = 0, + .idle_kill = 0, .vsz_limit = -1U, .unix_listeners = ARRAY_INIT, diff --git a/src/master/master-settings.c b/src/master/master-settings.c index 125e499136..6a44be09e2 100644 --- a/src/master/master-settings.c +++ b/src/master/master-settings.c @@ -111,6 +111,7 @@ static const struct setting_define service_setting_defines[] = { 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", @@ -140,6 +141,7 @@ static const struct service_settings service_default_settings = { .process_limit = -1U, .client_limit = 0, .service_count = 0, + .idle_kill = 0, .vsz_limit = (uoff_t)-1, .unix_listeners = ARRAY_INIT, @@ -175,6 +177,7 @@ static const struct setting_define master_setting_defines[] = { 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), @@ -201,6 +204,7 @@ static const struct master_settings master_default_settings = { .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, diff --git a/src/master/master-settings.h b/src/master/master-settings.h index b899e99475..04f9d03a7c 100644 --- a/src/master/master-settings.h +++ b/src/master/master-settings.h @@ -13,6 +13,7 @@ struct master_settings { 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; diff --git a/src/master/service-monitor.c b/src/master/service-monitor.c index abd1112328..51649f2c28 100644 --- a/src/master/service-monitor.c +++ b/src/master/service-monitor.c @@ -20,7 +20,6 @@ #include #include -#define SERVICE_PROCESS_KILL_IDLE_MSECS (1000*60) #define SERVICE_STARTUP_FAILURE_THROTTLE_SECS 60 #define SERVICE_DROP_WARN_INTERVAL_SECS 60 @@ -99,12 +98,12 @@ static void service_status_less(struct service_process *process, 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); diff --git a/src/master/service.c b/src/master/service.c index a16ee368d8..c27a0f5024 100644 --- a/src/master/service.c +++ b/src/master/service.c @@ -194,6 +194,8 @@ service_create(pool_t pool, const struct service_settings *set, 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) { diff --git a/src/master/service.h b/src/master/service.h index 1275afe721..0f9863ca44 100644 --- a/src/master/service.h +++ b/src/master/service.h @@ -64,6 +64,8 @@ struct service { /* 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; diff --git a/src/pop3-login/pop3-login-settings.c b/src/pop3-login/pop3-login-settings.c index 3ae9513eb9..10d11dfbe8 100644 --- a/src/pop3-login/pop3-login-settings.c +++ b/src/pop3-login/pop3-login-settings.c @@ -40,6 +40,7 @@ struct service_settings pop3_login_service_settings = { .process_limit = 0, .client_limit = 0, .service_count = 1, + .idle_kill = 0, .vsz_limit = 64, .unix_listeners = ARRAY_INIT, diff --git a/src/pop3/pop3-settings.c b/src/pop3/pop3-settings.c index 835cbca315..0fa239f6ca 100644 --- a/src/pop3/pop3-settings.c +++ b/src/pop3/pop3-settings.c @@ -43,6 +43,7 @@ struct service_settings pop3_service_settings = { .process_limit = 1024, .client_limit = 1, .service_count = 1, + .idle_kill = 0, .vsz_limit = -1U, .unix_listeners = { { &pop3_unix_listeners_buf, diff --git a/src/ssl-params/ssl-params-settings.c b/src/ssl-params/ssl-params-settings.c index fc3f7b07cf..bf7a9dd452 100644 --- a/src/ssl-params/ssl-params-settings.c +++ b/src/ssl-params/ssl-params-settings.c @@ -40,6 +40,7 @@ struct service_settings ssl_params_service_settings = { .process_limit = 0, .client_limit = 0, .service_count = 0, + .idle_kill = 0, .vsz_limit = -1U, .unix_listeners = { { &ssl_params_unix_listeners_buf, diff --git a/src/util/tcpwrap-settings.c b/src/util/tcpwrap-settings.c index 04fc4a4986..deaa03dc11 100644 --- a/src/util/tcpwrap-settings.c +++ b/src/util/tcpwrap-settings.c @@ -25,6 +25,7 @@ struct service_settings tcpwrap_service_settings = { .process_limit = 0, .client_limit = 1, .service_count = 0, + .idle_kill = 0, .vsz_limit = -1U, .unix_listeners = ARRAY_INIT,