From: Timo Sirainen Date: Wed, 13 May 2015 01:11:34 +0000 (+0300) Subject: director: Include useful statistics in process title. X-Git-Tag: 2.2.17~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ece0a20249ce26208db3415ba2e79423678856f8;p=thirdparty%2Fdovecot%2Fcore.git director: Include useful statistics in process title. --- diff --git a/src/director/director-connection.c b/src/director/director-connection.c index 7938906a77..f628f26894 100644 --- a/src/director/director-connection.c +++ b/src/director/director-connection.c @@ -1496,6 +1496,7 @@ static void director_connection_input(struct director_connection *conn) { struct director *dir = conn->dir; char *line; + uoff_t prev_offset; bool ret; switch (i_stream_read(conn->input)) { @@ -1524,7 +1525,11 @@ static void director_connection_input(struct director_connection *conn) } director_sync_freeze(dir); + prev_offset = conn->input->v_offset; while ((line = i_stream_next_line(conn->input)) != NULL) { + dir->ring_traffic_input += conn->input->v_offset - prev_offset; + prev_offset = conn->input->v_offset; + T_BEGIN { ret = director_connection_handle_line(conn, line); } T_END; @@ -1872,6 +1877,8 @@ void director_connection_send(struct director_connection *conn, "disconnecting", conn->name); } o_stream_close(conn->output); + } else { + conn->dir->ring_traffic_output += len; } } diff --git a/src/director/director-request.c b/src/director/director-request.c index d8e7044eca..803a3afbc6 100644 --- a/src/director/director-request.c +++ b/src/director/director-request.c @@ -128,6 +128,8 @@ void director_request(struct director *dir, const char *username, unsigned int username_hash = user_directory_get_username_hash(dir->users, username); + dir->num_requests++; + request = i_new(struct director_request, 1); request->dir = dir; request->create_time = ioloop_time; diff --git a/src/director/director.h b/src/director/director.h index eea60a2599..0283d69b12 100644 --- a/src/director/director.h +++ b/src/director/director.h @@ -79,6 +79,9 @@ struct director { time_t ring_first_alone; + uint64_t num_requests; + uint64_t ring_traffic_input, ring_traffic_output; + /* director ring handshaking is complete. director can start serving clients. */ unsigned int ring_handshaked:1; diff --git a/src/director/main.c b/src/director/main.c index f7c41155b2..208748184e 100644 --- a/src/director/main.c +++ b/src/director/main.c @@ -3,7 +3,9 @@ #include "lib.h" #include "ioloop.h" #include "array.h" +#include "str.h" #include "restrict-access.h" +#include "process-title.h" #include "master-interface.h" #include "master-service.h" #include "master-service-settings.h" @@ -11,6 +13,7 @@ #include "doveadm-connection.h" #include "login-connection.h" #include "notify-connection.h" +#include "user-directory.h" #include "director.h" #include "director-host.h" #include "director-connection.h" @@ -25,6 +28,28 @@ static struct director *director; static struct notify_connection *notify_conn; +static struct timeout *to_proctitle_refresh; + +static void director_refresh_proctitle_timeout(void *context ATTR_UNUSED) +{ + static uint64_t prev_requests = 0, prev_input = 0, prev_output; + string_t *str; + + str = t_str_new(64); + str_printfa(str, "[%u users", user_directory_count(director->users)); + str_printfa(str, ", %lu req/s", + (unsigned long)(director->num_requests - prev_requests)); + str_printfa(str, ", %llu+%llu kB/s", + (unsigned long long)(director->ring_traffic_input - prev_input)/1024, + (unsigned long long)(director->ring_traffic_output - prev_output)/1024); + str_append_c(str, ']'); + + prev_requests = director->num_requests; + prev_input = director->ring_traffic_input; + prev_output = director->ring_traffic_output; + + process_title_set(str_c(str)); +} static int director_client_connected(int fd, const struct ip_addr *ip) { @@ -145,6 +170,11 @@ static void main_preinit(void) struct ip_addr listen_ip; unsigned int listen_port; + if (master_service_settings_get(master_service)->verbose_proctitle) { + to_proctitle_refresh = + timeout_add(1000, director_refresh_proctitle_timeout, + (void *)NULL); + } set = master_service_settings_get_others(master_service)[0]; listen_port = find_inet_listener_port(&listen_ip, set); @@ -168,6 +198,8 @@ static void main_preinit(void) static void main_deinit(void) { + if (to_proctitle_refresh != NULL) + timeout_remove(&to_proctitle_refresh); if (notify_conn != NULL) notify_connection_deinit(¬ify_conn); director_deinit(&director); @@ -183,8 +215,7 @@ int main(int argc, char *argv[]) NULL }; const enum master_service_flags service_flags = - MASTER_SERVICE_FLAG_NO_IDLE_DIE | - MASTER_SERVICE_FLAG_UPDATE_PROCTITLE; + MASTER_SERVICE_FLAG_NO_IDLE_DIE; unsigned int test_port = 0; const char *error; bool debug = FALSE; diff --git a/src/director/user-directory.c b/src/director/user-directory.c index 56aa2d1c45..d12b7b9d97 100644 --- a/src/director/user-directory.c +++ b/src/director/user-directory.c @@ -91,6 +91,11 @@ static void user_directory_drop_expired(struct user_directory *dir) user_free(dir, dir->head); } +unsigned int user_directory_count(struct user_directory *dir) +{ + return hash_table_count(dir->hash); +} + struct user *user_directory_lookup(struct user_directory *dir, unsigned int username_hash) { diff --git a/src/director/user-directory.h b/src/director/user-directory.h index 7578c6b161..1b9c147e74 100644 --- a/src/director/user-directory.h +++ b/src/director/user-directory.h @@ -51,6 +51,8 @@ struct user_directory * user_directory_init(unsigned int timeout_secs, const char *username_hash_fmt); void user_directory_deinit(struct user_directory **dir); +/* Returns the number of users currently in directory. */ +unsigned int user_directory_count(struct user_directory *dir); /* Look up username from directory. Returns NULL if not found. */ struct user *user_directory_lookup(struct user_directory *dir, unsigned int username_hash);