Mercurial > dovecot > core-2.2
changeset 18664:502755a1af5f
director: Include useful statistics in process title.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 13 May 2015 04:11:34 +0300 |
parents | 1c268a7cc74a |
children | b7aed6290e7e |
files | src/director/director-connection.c src/director/director-request.c src/director/director.h src/director/main.c src/director/user-directory.c src/director/user-directory.h |
diffstat | 6 files changed, 52 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/director/director-connection.c Wed May 13 04:10:53 2015 +0300 +++ b/src/director/director-connection.c Wed May 13 04:11:34 2015 +0300 @@ -1496,6 +1496,7 @@ { struct director *dir = conn->dir; char *line; + uoff_t prev_offset; bool ret; switch (i_stream_read(conn->input)) { @@ -1524,7 +1525,11 @@ } 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 @@ "disconnecting", conn->name); } o_stream_close(conn->output); + } else { + conn->dir->ring_traffic_output += len; } }
--- a/src/director/director-request.c Wed May 13 04:10:53 2015 +0300 +++ b/src/director/director-request.c Wed May 13 04:11:34 2015 +0300 @@ -128,6 +128,8 @@ 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;
--- a/src/director/director.h Wed May 13 04:10:53 2015 +0300 +++ b/src/director/director.h Wed May 13 04:11:34 2015 +0300 @@ -79,6 +79,9 @@ 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;
--- a/src/director/main.c Wed May 13 04:10:53 2015 +0300 +++ b/src/director/main.c Wed May 13 04:11:34 2015 +0300 @@ -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 @@ 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_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 @@ 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;
--- a/src/director/user-directory.c Wed May 13 04:10:53 2015 +0300 +++ b/src/director/user-directory.c Wed May 13 04:11:34 2015 +0300 @@ -91,6 +91,11 @@ 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) {
--- a/src/director/user-directory.h Wed May 13 04:10:53 2015 +0300 +++ b/src/director/user-directory.h Wed May 13 04:11:34 2015 +0300 @@ -51,6 +51,8 @@ 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);