]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Added support for per-service idle kill timeout.
authorTimo Sirainen <tss@iki.fi>
Fri, 25 Jun 2010 13:03:20 +0000 (14:03 +0100)
committerTimo Sirainen <tss@iki.fi>
Fri, 25 Jun 2010 13:03:20 +0000 (14:03 +0100)
Director and anvil services are by default never killed.
This also fixes the errors about idling director process not dying.

--HG--
branch : HEAD

20 files changed:
src/anvil/anvil-settings.c
src/auth/auth-settings.c
src/config/config-settings.c
src/dict/dict-settings.c
src/director/director-settings.c
src/dns/dns-client-settings.c
src/imap-login/imap-login-settings.c
src/imap/imap-settings.c
src/lib-master/service-settings.h
src/lmtp/lmtp-settings.c
src/log/log-settings.c
src/master/master-settings.c
src/master/master-settings.h
src/master/service-monitor.c
src/master/service.c
src/master/service.h
src/pop3-login/pop3-login-settings.c
src/pop3/pop3-settings.c
src/ssl-params/ssl-params-settings.c
src/util/tcpwrap-settings.c

index f28d6b7186afa0abf8746abfe12b8b37630f9e32..04e2d9693781a0d851d1da960d483ff753bb7770 100644 (file)
@@ -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,
index 5fd66b24c200d9326bc55abdb8db3ecf34bd042a..d492e11c1e480e6e2b1b88029b4b0911b082caf0 100644 (file)
@@ -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,
index 7c246d435020bd4b006f517f30d2f1e1a789026d..cd6964b674b240e7de7bfc5c7489929dcbdedcce 100644 (file)
@@ -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,
index c83f4577480168b1cde6ebf237792ae857cfe419..0e3e675b561d287a848c9f557d74c6bf235604a6 100644 (file)
@@ -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,
index 3af1ef6ccf49668d925bcc1a4925bece61911258..d295ce05eceb857dad9b731d8916bb88532ddc2d 100644 (file)
@@ -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,
index 89db9c00185c216f4df99fa16eea9c0fe3e74083..c56f770c2344aa0695d1df10de7c9ac05779723a 100644 (file)
@@ -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,
index d1469608e1b0f3dcfa028290ff67a441b1ec466c..3672fb4d6615f0b656829216f20467d999bf5d1f 100644 (file)
@@ -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,
index 93167d3f57abb99d47181afeb871444f9f47f3a0..103f9e9abcac97c07d326ecf87e06da1d939c31d 100644 (file)
@@ -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,
index 35dbfc392ae7847160778e3bde4fb91e5f66574a..45cb7e1f094726edfe6e398002362fbb28190cd9 100644 (file)
@@ -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;
index ad9f3d49a9c8ef60ec4d932c2477cca8a95f3de2..323322fa1a6b903351b6d84f34b5c85a121c32ea 100644 (file)
@@ -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,
index 1dd6b21c3c2ebe1c8013b8d9908d6c7dff5e80ae..3ddb25e510277c9fddee795b3c9db7f631f53b2c 100644 (file)
@@ -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,
index 125e49913657865b69b4d009004b05d7f0040be3..6a44be09e28ea2e604b9b2f9d2ed50b0e923ba93 100644 (file)
@@ -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,
index b899e994758dae521eeb3c205d1bb104ad638135..04f9d03a7cc9e7c5b323b43439497842124135e8 100644 (file)
@@ -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;
index abd11123289035e4ae015e3a1b4f716b13b2ba04..51649f2c28048ce89f6aec94a92341d44d6dc7f7 100644 (file)
@@ -20,7 +20,6 @@
 #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
 
@@ -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);
index a16ee368d8e568bae357f843cce90e014b148e16..c27a0f50240ab9827d3dcd8b90b410c36b96272d 100644 (file)
@@ -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) {
index 1275afe721dfb453ce5e5e22a7551fb0ebef77cc..0f9863ca44a0d1d4898c30b1a4a335df09b27a87 100644 (file)
@@ -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;
 
index 3ae9513eb9e147279662e316ef1c5eb966464ce5..10d11dfbe8ec0b56ac9173405e00ace3d1d08bd9 100644 (file)
@@ -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,
index 835cbca3152aec78e0de374a9f3dd1522ea2698e..0fa239f6ca5fc40e2d7e4b7ac2e31af0b68b411e 100644 (file)
@@ -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,
index fc3f7b07cfa5da0b041cefaa8ce3828cf4859943..bf7a9dd452c88a914f13e91517a355747be87370 100644 (file)
@@ -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,
index 04fc4a4986161117b65faeaa0133f50b16c79f5f..deaa03dc11f28f17cf598cf403c3fa71268b4cde 100644 (file)
@@ -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,