Skip to content

Commit

Permalink
lib-master, master: Initialize stats-client via environment variables
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
sirainen authored and cmouse committed Aug 30, 2018
1 parent 0deba9f commit 08dc431
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 6 deletions.
4 changes: 4 additions & 0 deletions src/lib-master/master-interface.h
Expand Up @@ -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 */
Expand Down
10 changes: 5 additions & 5 deletions src/lib-master/master-service-settings.c
Expand Up @@ -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)
Expand Down
6 changes: 6 additions & 0 deletions src/lib-master/master-service.c
Expand Up @@ -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;
Expand Down
9 changes: 8 additions & 1 deletion src/master/service-process.c
Expand Up @@ -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");
Expand All @@ -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. */
Expand All @@ -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)
Expand Down

0 comments on commit 08dc431

Please sign in to comment.