From: Timo Sirainen Date: Thu, 14 May 2009 22:52:54 +0000 (-0400) Subject: lib-master: Added support for keeping config connection open and reusing it for later... X-Git-Tag: 2.0.alpha1~770 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=01230de017cd273de41143d88e9c18df1243ae8a;p=thirdparty%2Fdovecot%2Fcore.git lib-master: Added support for keeping config connection open and reusing it for later requests. --HG-- branch : HEAD --- diff --git a/src/lib-master/master-service-private.h b/src/lib-master/master-service-private.h index de5332ec79..7be39704dc 100644 --- a/src/lib-master/master-service-private.h +++ b/src/lib-master/master-service-private.h @@ -22,8 +22,9 @@ struct master_service { const char *version_string; const char *config_path; - int syslog_facility; ARRAY_TYPE(const_string) config_overrides; + int config_fd; + int syslog_facility; unsigned int socket_count, ssl_socket_count; struct master_service_listener *listeners; diff --git a/src/lib-master/master-service-settings.c b/src/lib-master/master-service-settings.c index a234ebed94..421bc097c9 100644 --- a/src/lib-master/master-service-settings.c +++ b/src/lib-master/master-service-settings.c @@ -106,19 +106,24 @@ master_service_read_config(struct master_service *service, int fd, ret; path = master_service_get_config_path(service); - fd = net_connect_unix(path); - if (fd < 0) { - *error_r = t_strdup_printf("net_connect_unix(%s) failed: %m", - path); - - if (stat(path, &st) == 0 && !S_ISFIFO(st.st_mode)) { - /* it's a file, not a socket */ - master_service_exec_config(service, - input->preserve_home); + if (service->config_fd != -1) { + fd = service->config_fd; + service->config_fd = -1; + } else { + fd = net_connect_unix(path); + if (fd < 0) { + *error_r = t_strdup_printf( + "net_connect_unix(%s) failed: %m", path); + + if (stat(path, &st) == 0 && !S_ISFIFO(st.st_mode)) { + /* it's a file, not a socket */ + master_service_exec_config(service, + input->preserve_home); + } + return -1; } - return -1; + net_set_nonblock(fd, FALSE); } - net_set_nonblock(fd, FALSE); T_BEGIN { string_t *str; @@ -221,9 +226,16 @@ int master_service_settings_read(struct master_service *service, i_assert(ret <= 0); if (ret < 0) { *error_r = settings_parser_get_error(parser); + (void)close(fd); return -1; } } + + if ((service->flags & MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN) == 0) + (void)close(fd); + else + service->config_fd = fd; + /* let environment override settings. especially useful for the settings from userdb. */ if (settings_parse_environ(parser) < 0) { diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index 01215a2c60..4b88f1a66f 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -96,6 +96,7 @@ master_service_init(const char *name, enum master_service_flags flags, service->flags = flags; service->ioloop = io_loop_create(); service->service_count_left = (unsigned int)-1; + service->config_fd = -1; service->config_path = getenv(MASTER_CONFIG_FILE_ENV); if (service->config_path == NULL) diff --git a/src/lib-master/master-service.h b/src/lib-master/master-service.h index 129588148e..6b53abd45b 100644 --- a/src/lib-master/master-service.h +++ b/src/lib-master/master-service.h @@ -9,7 +9,10 @@ enum master_service_flags { /* this process is currently running standalone without a master */ MASTER_SERVICE_FLAG_STANDALONE = 0x02, /* Log to stderr instead of the configured log file */ - MASTER_SERVICE_FLAG_LOG_TO_STDERR = 0x04 + MASTER_SERVICE_FLAG_LOG_TO_STDERR = 0x04, + /* Service is going to do multiple configuration lookups, + keep the connection to config service open. */ + MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN = 0x08 }; struct master_service_connection {