From: Timo Sirainen Date: Wed, 29 Aug 2018 19:09:57 +0000 (+0300) Subject: lib-master, master: Initialize stats-client via environment variables X-Git-Tag: 2.3.4~117 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a02fa57ff32e1ff4c1daf1ff87136010ba08c009;p=thirdparty%2Fdovecot%2Fcore.git lib-master, master: Initialize stats-client via environment variables That way it's initialized before settings are read, and it can catch events earlier. It also doesn't require all services to read settings if they otherwise don't need them. --- diff --git a/src/lib-master/master-interface.h b/src/lib-master/master-interface.h index 821aa02b5a..1ddef5f687 100644 --- a/src/lib-master/master-interface.h +++ b/src/lib-master/master-interface.h @@ -79,6 +79,10 @@ enum master_login_state { be used to initialize debug logging immediately at startup. */ #define DOVECOT_LOG_DEBUG_ENV "LOG_DEBUG" +/* getenv(DOVECOT_STATS_WRITER_SOCKET_PATH) returns path to the stats-writer + socket. */ +#define DOVECOT_STATS_WRITER_SOCKET_PATH "STATS_WRITER_SOCKET_PATH" + /* Write pipe to anvil. */ #define MASTER_ANVIL_FD 3 /* Anvil reads new log fds from this fd */ diff --git a/src/lib-master/master-service-settings.c b/src/lib-master/master-service-settings.c index 5fee08a096..fb555c3ce9 100644 --- a/src/lib-master/master-service-settings.c +++ b/src/lib-master/master-service-settings.c @@ -766,13 +766,13 @@ int master_service_settings_read(struct master_service *service, /* running standalone. we want to ignore plugin versions. */ service->version_string = NULL; } - if ((service->flags & MASTER_SERVICE_FLAG_SEND_STATS) != 0) { + if ((service->flags & MASTER_SERVICE_FLAG_SEND_STATS) != 0 && + (service->flags & MASTER_SERVICE_FLAG_STANDALONE) != 0) { /* When running standalone (e.g. doveadm) try to connect to the stats socket, but don't log an error if it's not running. - It may be intentional. */ - bool silent_notfound_errors = - (service->flags & MASTER_SERVICE_FLAG_STANDALONE) != 0; - master_service_init_stats_client(service, silent_notfound_errors); + It may be intentional. Non-standalone stats-client + initialization was already done earlier. */ + master_service_init_stats_client(service, TRUE); } if (service->set->shutdown_clients) diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index 2e1914e22b..860986ca48 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -338,6 +338,12 @@ master_service_init(const char *name, enum master_service_flags flags, are dropped. */ master_service_config_socket_try_open(service); } + if ((flags & MASTER_SERVICE_FLAG_SEND_STATS) != 0) { + /* Initialize stats-client early so it can see all events. */ + value = getenv(DOVECOT_STATS_WRITER_SOCKET_PATH); + if (value != NULL) + service->stats_client = stats_client_init(value, FALSE); + } master_service_verify_version_string(service); return service; diff --git a/src/master/service-process.c b/src/master/service-process.c index 2733daf00b..e6fb486084 100644 --- a/src/master/service-process.c +++ b/src/master/service-process.c @@ -232,6 +232,8 @@ static void service_process_setup_environment(struct service *service, unsigned int uid, const char *hostdomain) { + const struct master_service_settings *service_set = + service->list->service_set; master_service_env_clean(); env_put(MASTER_IS_PARENT_ENV"=1"); @@ -255,6 +257,11 @@ service_process_setup_environment(struct service *service, unsigned int uid, if (!service->set->master_set->version_ignore) env_put(MASTER_DOVECOT_VERSION_ENV"="PACKAGE_VERSION); + if (service_set->stats_writer_socket_path[0] != '\0') { + env_put(t_strdup_printf(DOVECOT_STATS_WRITER_SOCKET_PATH"=%s/%s", + service_set->base_dir, + service_set->stats_writer_socket_path)); + } if (ssl_manual_key_password != NULL && service->have_inet_listeners) { /* manually given SSL password. give it only to services that have inet listeners. */ @@ -265,7 +272,7 @@ service_process_setup_environment(struct service *service, unsigned int uid, service_anvil_global->restarted) env_put("ANVIL_RESTARTED=1"); env_put(t_strconcat(DOVECOT_LOG_DEBUG_ENV"=", - service->list->service_set->log_debug, NULL)); + service_set->log_debug, NULL)); } static void service_process_status_timeout(struct service_process *process)