]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
stats: Added num_connected_sessions for domains and IPs.
authorTimo Sirainen <tss@iki.fi>
Tue, 12 Aug 2014 11:44:11 +0000 (14:44 +0300)
committerTimo Sirainen <tss@iki.fi>
Tue, 12 Aug 2014 11:44:11 +0000 (14:44 +0300)
src/stats/client-export.c
src/stats/mail-domain.c
src/stats/mail-domain.h
src/stats/mail-ip.c
src/stats/mail-ip.h
src/stats/mail-session.c
src/stats/mail-stats.h
src/stats/mail-user.c
src/stats/mail-user.h

index c7a7ca84f1b958820c357fd49e3b383c1aa7ab48..4b8ad213c54f6d33cd47c11be69d59e1c40e4fb9 100644 (file)
@@ -401,7 +401,7 @@ static int client_export_iter_domain(struct client *client)
        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 @@ static int client_export_iter_domain(struct client *client)
                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 @@ static int client_export_iter_ip(struct client *client)
        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 @@ static int client_export_iter_ip(struct client *client)
                } 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),
index dbde7f4832c2b0c6bf40cfcc6431efe4c65701a9..dabc9afbf8825d6ee18c3192794267f5db4aa01a 100644 (file)
@@ -19,14 +19,13 @@ static size_t mail_domain_memsize(const struct mail_domain *domain)
        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 @@ struct mail_domain *mail_domain_login(const char *name)
        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);
index 4727bcf99a80915e22e6e10da8bb5453bbb1f7eb..ac698bdd23aaa08664fe1711eba6d853cc145a9d 100644 (file)
@@ -5,7 +5,9 @@ struct mail_stats;
 
 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);
index 0081f36bc27e65f31af3551ba08a1c725a9dd210..244c00c818c358ff1e0904cb435c100211d12602 100644 (file)
@@ -26,6 +26,7 @@ struct mail_ip *mail_ip_login(const struct ip_addr *ip_addr)
        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 @@ struct mail_ip *mail_ip_login(const struct ip_addr *ip_addr)
        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);
index d8e9c75601b15f8779d0ca7d73b22e570882a5c8..23ac3a12e218749c735c3cb9af65130763fdf249 100644 (file)
@@ -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);
index a762bd76f7ba0242b35ba295ed64b292ae05ce51..c03b94f594546a1b11999ff52c5953f2efbe4a29 100644 (file)
@@ -40,6 +40,12 @@ static void mail_session_disconnect(struct mail_session *session)
 {
        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 @@ int mail_session_disconnect_parse(const char *const *args, const char **error_r)
        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;
 }
 
index 1141fd060dae32b6bc412e8d7d55333262d4f7e1..d7202e044365d2b0af1d5b5476a670c2bfc15145 100644 (file)
@@ -85,6 +85,7 @@ struct mail_domain {
        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_ip {
        struct mail_stats stats;
        unsigned int num_logins;
        unsigned int num_cmds;
+       unsigned int num_connected_sessions;
 
        int refcount;
        struct mail_session *sessions;
index de1343ebe75f6012a2274537b346701b89ec4f75..86180cb8ea0abbf0e4b0b2df36b14fb5d00cf819 100644 (file)
@@ -28,8 +28,8 @@ struct mail_user *mail_user_login(const char *username)
        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 @@ struct mail_user *mail_user_login(const char *username)
        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 @@ struct mail_user *mail_user_login(const char *username)
        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);
index 32e473c35ae4d42726762f0e09dff130884da257..3aeeaedc612b5dc10576ed4354bc9978e46ed9f5 100644 (file)
@@ -6,6 +6,7 @@ struct mail_stats;
 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,