]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
director: Include useful statistics in process title.
authorTimo Sirainen <tss@iki.fi>
Wed, 13 May 2015 01:11:34 +0000 (04:11 +0300)
committerTimo Sirainen <tss@iki.fi>
Wed, 13 May 2015 01:11:34 +0000 (04:11 +0300)
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

index 7938906a778f5073a513bad75bd8a2a20eb8efe5..f628f2689485ae1608a7678d8d190b841b36c6cd 100644 (file)
@@ -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;
        }
 }
 
index d8e7044eca1f47137d532351fadb80981f1e61ed..803a3afbc614473c2e6ce731addb033772e2529d 100644 (file)
@@ -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;
index eea60a25990dbab73732139de579266f36a3c063..0283d69b126922816f37706ebbd81f1859350005 100644 (file)
@@ -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;
index f7c41155b22b6b65975dcb22b467167bff03ac23..208748184e8a1927782b6b9a2555cc8b3230d834 100644 (file)
@@ -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"
 
 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(&notify_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;
index 56aa2d1c455358084984220f764c60bd09b67f58..d12b7b9d975fb5720b2345a5c48f28fbf4d166ba 100644 (file)
@@ -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)
 {
index 7578c6b1616f77f16101a0aea911be167e9e62e6..1b9c147e749cf323cbfa3351e64701628039c1c3 100644 (file)
@@ -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);