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.9~1496 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=08dc431156da5af5bd11e729816dc23d3aa99b67;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 d7d13bc73f..cde5b5aa17 100644 --- a/src/lib-master/master-service-settings.c +++ b/src/lib-master/master-service-settings.c @@ -768,13 +768,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 e8c950d2b5..12636baf83 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 598f1a77c4..1215aec356 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)