dovecot-2.2: director: Include useful statistics in process title.

dovecot at dovecot.org dovecot at dovecot.org
Wed May 13 01:13:45 UTC 2015


details:   http://hg.dovecot.org/dovecot-2.2/rev/502755a1af5f
changeset: 18664:502755a1af5f
user:      Timo Sirainen <tss at iki.fi>
date:      Wed May 13 04:11:34 2015 +0300
description:
director: Include useful statistics in process title.

diffstat:

 src/director/director-connection.c |   7 +++++++
 src/director/director-request.c    |   2 ++
 src/director/director.h            |   3 +++
 src/director/main.c                |  35 +++++++++++++++++++++++++++++++++--
 src/director/user-directory.c      |   5 +++++
 src/director/user-directory.h      |   2 ++
 6 files changed, 52 insertions(+), 2 deletions(-)

diffs (165 lines):

diff -r 1c268a7cc74a -r 502755a1af5f src/director/director-connection.c
--- 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;
 	}
 }
 
diff -r 1c268a7cc74a -r 502755a1af5f src/director/director-request.c
--- 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;
diff -r 1c268a7cc74a -r 502755a1af5f src/director/director.h
--- 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;
diff -r 1c268a7cc74a -r 502755a1af5f src/director/main.c
--- 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(&notify_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;
diff -r 1c268a7cc74a -r 502755a1af5f src/director/user-directory.c
--- 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)
 {
diff -r 1c268a7cc74a -r 502755a1af5f src/director/user-directory.h
--- 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);


More information about the dovecot-cvs mailing list