dovecot-2.2: stats: Added num_connected_sessions for domains and...

dovecot at dovecot.org dovecot at dovecot.org
Tue Aug 12 11:46:24 UTC 2014


details:   http://hg.dovecot.org/dovecot-2.2/rev/f78d4b2bb6c3
changeset: 17706:f78d4b2bb6c3
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Aug 12 14:44:11 2014 +0300
description:
stats: Added num_connected_sessions for domains and IPs.

diffstat:

 src/stats/client-export.c |  12 +++++++-----
 src/stats/mail-domain.c   |  23 ++++++++++++++++-------
 src/stats/mail-domain.h   |   4 +++-
 src/stats/mail-ip.c       |   8 ++++++++
 src/stats/mail-ip.h       |   1 +
 src/stats/mail-session.c  |   9 ++++++++-
 src/stats/mail-stats.h    |   2 ++
 src/stats/mail-user.c     |   9 +++++++--
 src/stats/mail-user.h     |   1 +
 9 files changed, 53 insertions(+), 16 deletions(-)

diffs (237 lines):

diff -r 40b07d1f7f6a -r f78d4b2bb6c3 src/stats/client-export.c
--- a/src/stats/client-export.c	Tue Aug 12 13:12:01 2014 +0300
+++ b/src/stats/client-export.c	Tue Aug 12 14:44:11 2014 +0300
@@ -401,7 +401,7 @@
 	if (!cmd->header_sent) {
 		o_stream_nsend_str(client->output,
 			"domain\treset_timestamp\tlast_update"
-			"\tnum_logins\tnum_cmds"MAIL_STATS_HEADER);
+			"\tnum_logins\tnum_cmds\tnum_connected_sessions"MAIL_STATS_HEADER);
 		cmd->header_sent = TRUE;
 	}
 
@@ -415,8 +415,9 @@
 		str_append_tabescaped(cmd->str, domain->name);
 		str_printfa(cmd->str, "\t%ld", (long)domain->reset_timestamp);
 		client_export_timeval(cmd->str, &domain->last_update);
-		str_printfa(cmd->str, "\t%u\t%u",
-			    domain->num_logins, domain->num_cmds);
+		str_printfa(cmd->str, "\t%u\t%u\t%u",
+			    domain->num_logins, domain->num_cmds,
+			    domain->num_connected_sessions);
 		client_export_mail_stats(cmd->str, &domain->stats);
 		str_append_c(cmd->str, '\n');
 		o_stream_nsend(client->output, str_data(cmd->str),
@@ -442,7 +443,7 @@
 	if (!cmd->header_sent) {
 		o_stream_nsend_str(client->output,
 			"ip\treset_timestamp\tlast_update"
-			"\tnum_logins\tnum_cmds"MAIL_STATS_HEADER);
+			"\tnum_logins\tnum_cmds\tnum_connected_sessions"MAIL_STATS_HEADER);
 		cmd->header_sent = TRUE;
 	}
 
@@ -458,7 +459,8 @@
 		} T_END;
 		str_printfa(cmd->str, "\t%ld", (long)ip->reset_timestamp);
 		client_export_timeval(cmd->str, &ip->last_update);
-		str_printfa(cmd->str, "\t%u\t%u", ip->num_logins, ip->num_cmds);
+		str_printfa(cmd->str, "\t%u\t%u\t%u",
+			    ip->num_logins, ip->num_cmds, ip->num_connected_sessions);
 		client_export_mail_stats(cmd->str, &ip->stats);
 		str_append_c(cmd->str, '\n');
 		o_stream_nsend(client->output, str_data(cmd->str),
diff -r 40b07d1f7f6a -r f78d4b2bb6c3 src/stats/mail-domain.c
--- a/src/stats/mail-domain.c	Tue Aug 12 13:12:01 2014 +0300
+++ b/src/stats/mail-domain.c	Tue Aug 12 14:44:11 2014 +0300
@@ -19,14 +19,13 @@
 	return sizeof(*domain) + strlen(domain->name) + 1;
 }
 
-struct mail_domain *mail_domain_login(const char *name)
+struct mail_domain *mail_domain_login_create(const char *name)
 {
 	struct mail_domain *domain;
 
 	domain = hash_table_lookup(mail_domains_hash, name);
 	if (domain != NULL) {
-		domain->num_logins++;
-		mail_domain_refresh(domain, NULL);
+		mail_domain_login(domain);
 		return domain;
 	}
 
@@ -37,14 +36,24 @@
 	hash_table_insert(mail_domains_hash, domain->name, domain);
 	DLLIST_PREPEND_FULL(&stable_mail_domains, domain,
 			    stable_prev, stable_next);
-	DLLIST2_APPEND_FULL(&mail_domains_head, &mail_domains_tail, domain,
-			    sorted_prev, sorted_next);
-	domain->num_logins++;
-	domain->last_update = ioloop_timeval;
+	mail_domain_login(domain);
 	global_memory_alloc(mail_domain_memsize(domain));
 	return domain;
 }
 
+void mail_domain_login(struct mail_domain *domain)
+{
+	domain->num_logins++;
+	domain->num_connected_sessions++;
+	mail_domain_refresh(domain, NULL);
+}
+
+void mail_domain_disconnected(struct mail_domain *domain)
+{
+	i_assert(domain->num_connected_sessions > 0);
+	domain->num_connected_sessions--;
+}
+
 struct mail_domain *mail_domain_lookup(const char *name)
 {
 	return hash_table_lookup(mail_domains_hash, name);
diff -r 40b07d1f7f6a -r f78d4b2bb6c3 src/stats/mail-domain.h
--- a/src/stats/mail-domain.h	Tue Aug 12 13:12:01 2014 +0300
+++ b/src/stats/mail-domain.h	Tue Aug 12 14:44:11 2014 +0300
@@ -5,7 +5,9 @@
 
 extern struct mail_domain *stable_mail_domains;
 
-struct mail_domain *mail_domain_login(const char *name);
+struct mail_domain *mail_domain_login_create(const char *name);
+void mail_domain_login(struct mail_domain *domain);
+void mail_domain_disconnected(struct mail_domain *domain);
 struct mail_domain *mail_domain_lookup(const char *name);
 void mail_domain_refresh(struct mail_domain *domain,
 			 const struct mail_stats *diff_stats) ATTR_NULL(2);
diff -r 40b07d1f7f6a -r f78d4b2bb6c3 src/stats/mail-ip.c
--- a/src/stats/mail-ip.c	Tue Aug 12 13:12:01 2014 +0300
+++ b/src/stats/mail-ip.c	Tue Aug 12 14:44:11 2014 +0300
@@ -26,6 +26,7 @@
 	ip = hash_table_lookup(mail_ips_hash, ip_addr);
 	if (ip != NULL) {
 		ip->num_logins++;
+		ip->num_connected_sessions++;
 		mail_ip_refresh(ip, NULL);
 		return ip;
 	}
@@ -39,11 +40,18 @@
 	DLLIST2_APPEND_FULL(&mail_ips_head, &mail_ips_tail, ip,
 			    sorted_prev, sorted_next);
 	ip->num_logins++;
+	ip->num_connected_sessions++;
 	ip->last_update = ioloop_timeval;
 	global_memory_alloc(mail_ip_memsize(ip));
 	return ip;
 }
 
+void mail_ip_disconnected(struct mail_ip *ip)
+{
+	i_assert(ip->num_connected_sessions > 0);
+	ip->num_connected_sessions--;
+}
+
 struct mail_ip *mail_ip_lookup(const struct ip_addr *ip_addr)
 {
 	return hash_table_lookup(mail_ips_hash, ip_addr);
diff -r 40b07d1f7f6a -r f78d4b2bb6c3 src/stats/mail-ip.h
--- a/src/stats/mail-ip.h	Tue Aug 12 13:12:01 2014 +0300
+++ b/src/stats/mail-ip.h	Tue Aug 12 14:44:11 2014 +0300
@@ -4,6 +4,7 @@
 extern struct mail_ip *stable_mail_ips;
 
 struct mail_ip *mail_ip_login(const struct ip_addr *ip_addr);
+void mail_ip_disconnected(struct mail_ip *ip);
 struct mail_ip *mail_ip_lookup(const struct ip_addr *ip_addr);
 void mail_ip_refresh(struct mail_ip *ip, const struct mail_stats *diff_stats)
 	ATTR_NULL(2);
diff -r 40b07d1f7f6a -r f78d4b2bb6c3 src/stats/mail-session.c
--- a/src/stats/mail-session.c	Tue Aug 12 13:12:01 2014 +0300
+++ b/src/stats/mail-session.c	Tue Aug 12 14:44:11 2014 +0300
@@ -40,6 +40,12 @@
 {
 	uint8_t *guid_p = session->guid;
 
+	i_assert(!session->disconnected);
+
+	mail_user_disconnected(session->user);
+	if (session->ip != NULL)
+		mail_ip_disconnected(session->ip);
+
 	hash_table_remove(mail_sessions_hash, guid_p);
 	session->disconnected = TRUE;
 	timeout_remove(&session->to_idle);
@@ -238,7 +244,8 @@
 	if ((ret = mail_session_lookup(args[0], &session, error_r)) <= 0)
 		return ret;
 
-	mail_session_disconnect(session);
+	if (!session->disconnected)
+		mail_session_disconnect(session);
 	return 0;
 }
 
diff -r 40b07d1f7f6a -r f78d4b2bb6c3 src/stats/mail-stats.h
--- a/src/stats/mail-stats.h	Tue Aug 12 13:12:01 2014 +0300
+++ b/src/stats/mail-stats.h	Tue Aug 12 14:44:11 2014 +0300
@@ -85,6 +85,7 @@
 	struct mail_stats stats;
 	unsigned int num_logins;
 	unsigned int num_cmds;
+	unsigned int num_connected_sessions;
 
 	int refcount;
 	struct mail_user *users;
@@ -100,6 +101,7 @@
 	struct mail_stats stats;
 	unsigned int num_logins;
 	unsigned int num_cmds;
+	unsigned int num_connected_sessions;
 
 	int refcount;
 	struct mail_session *sessions;
diff -r 40b07d1f7f6a -r f78d4b2bb6c3 src/stats/mail-user.c
--- a/src/stats/mail-user.c	Tue Aug 12 13:12:01 2014 +0300
+++ b/src/stats/mail-user.c	Tue Aug 12 14:44:11 2014 +0300
@@ -28,8 +28,8 @@
 	user = hash_table_lookup(mail_users_hash, username);
 	if (user != NULL) {
 		user->num_logins++;
-		user->domain->num_logins++;
 		mail_user_refresh(user, NULL);
+		mail_domain_login(user->domain);
 		return user;
 	}
 
@@ -42,7 +42,7 @@
 	user = i_new(struct mail_user, 1);
 	user->name = i_strdup(username);
 	user->reset_timestamp = ioloop_time;
-	user->domain = mail_domain_login(domain);
+	user->domain = mail_domain_login_create(domain);
 
 	hash_table_insert(mail_users_hash, user->name, user);
 	DLLIST_PREPEND_FULL(&stable_mail_users, user,
@@ -59,6 +59,11 @@
 	return user;
 }
 
+void mail_user_disconnected(struct mail_user *user)
+{
+	mail_domain_disconnected(user->domain);
+}
+
 struct mail_user *mail_user_lookup(const char *username)
 {
 	return hash_table_lookup(mail_users_hash, username);
diff -r 40b07d1f7f6a -r f78d4b2bb6c3 src/stats/mail-user.h
--- a/src/stats/mail-user.h	Tue Aug 12 13:12:01 2014 +0300
+++ b/src/stats/mail-user.h	Tue Aug 12 14:44:11 2014 +0300
@@ -6,6 +6,7 @@
 extern struct mail_user *stable_mail_users;
 
 struct mail_user *mail_user_login(const char *username);
+void mail_user_disconnected(struct mail_user *user);
 struct mail_user *mail_user_lookup(const char *username);
 
 void mail_user_refresh(struct mail_user *user,


More information about the dovecot-cvs mailing list