]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-master: Added master_service_get_process_min_avail()
authorTimo Sirainen <tss@iki.fi>
Thu, 4 Apr 2013 20:35:08 +0000 (23:35 +0300)
committerTimo Sirainen <tss@iki.fi>
Thu, 4 Apr 2013 20:35:08 +0000 (23:35 +0300)
src/lib-master/master-interface.h
src/lib-master/master-service-private.h
src/lib-master/master-service.c
src/lib-master/master-service.h
src/master/service-process.c

index 3ffa04b0a9899dc1e6c8b386aef898d52bb85548..5b1f01222eb2c89928e3e8be214ac0989611bf1d 100644 (file)
@@ -48,6 +48,10 @@ enum master_login_state {
    can be created before reaching the limit */
 #define MASTER_PROCESS_LIMIT_ENV "PROCESS_LIMIT"
 
+/* getenv(MASTER_PROCESS_MIN_AVAIL_ENV) specifies how many processes of this
+   type are created at startup and are kept running all the time */
+#define MASTER_PROCESS_MIN_AVAIL_ENV "PROCESS_MIN_AVAIL"
+
 /* getenv(MASTER_SERVICE_COUNT_ENV) specifies how many client connections the
    process can finish handling before it should kill itself. */
 #define MASTER_SERVICE_COUNT_ENV "SERVICE_COUNT"
index b01cef38aa3a7760661ea646fbbf9d4e9cd99bd7..ccba6a6b1af49505288385c5610407d1bd001f52 100644 (file)
@@ -37,6 +37,7 @@ struct master_service {
        unsigned int service_count_left;
        unsigned int total_available_count;
        unsigned int process_limit;
+       unsigned int process_min_avail;
        unsigned int idle_kill_secs;
 
        struct master_status master_status;
index f762248a87f05e22586d85674b83596b3bc8047d..378bc6343d862ee636154a72816bfbccda92b12c 100644 (file)
@@ -216,6 +216,11 @@ master_service_init(const char *name, enum master_service_flags flags,
                    count > 0)
                        service->process_limit = count;
 
+               value = getenv(MASTER_PROCESS_MIN_AVAIL_ENV);
+               if (value != NULL && str_to_uint(value, &count) == 0 &&
+                   count > 0)
+                       service->process_min_avail = count;
+
                /* set the default service count */
                value = getenv(MASTER_SERVICE_COUNT_ENV);
                if (value != NULL && str_to_uint(value, &count) == 0 &&
@@ -491,6 +496,11 @@ unsigned int master_service_get_process_limit(struct master_service *service)
        return service->process_limit;
 }
 
+unsigned int master_service_get_process_min_avail(struct master_service *service)
+{
+       return service->process_min_avail;
+}
+
 unsigned int master_service_get_idle_kill_secs(struct master_service *service)
 {
        return service->idle_kill_secs;
index e1896dba45e204a604e5092228da45b3cab7c893..b975895101b06028e62a4927d04b7c9cc4addcf6 100644 (file)
@@ -105,6 +105,8 @@ unsigned int master_service_get_client_limit(struct master_service *service);
 /* Returns how many processes of this type can be created before reaching the
    limit. */
 unsigned int master_service_get_process_limit(struct master_service *service);
+/* Returns service { process_min_avail } */
+unsigned int master_service_get_process_min_avail(struct master_service *service);
 /* Returns the service's idle_kill timeout in seconds. Normally master handles
    sending the kill request when the process has no clients, but some services
    with permanent client connections may need to handle this themselves. */
index f6d1f4031c6e5d50297ad7835284c530b90a47f4..c0568e58aba5fa3925bb24017017463ec5a548d7 100644 (file)
@@ -228,6 +228,8 @@ service_process_setup_environment(struct service *service, unsigned int uid)
                                service->client_limit));
        env_put(t_strdup_printf(MASTER_PROCESS_LIMIT_ENV"=%u",
                                service->process_limit));
+       env_put(t_strdup_printf(MASTER_PROCESS_MIN_AVAIL_ENV"=%u",
+                               service->set->process_min_avail));
        env_put(t_strdup_printf(MASTER_SERVICE_IDLE_KILL_ENV"=%u",
                                service->idle_kill));
        if (service->set->service_count != 0) {