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(¬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;
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