]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
stats: Keep track of last_update in microsecond precision and export it as such.
authorTimo Sirainen <tss@iki.fi>
Thu, 1 Sep 2011 07:40:17 +0000 (10:40 +0300)
committerTimo Sirainen <tss@iki.fi>
Thu, 1 Sep 2011 07:40:17 +0000 (10:40 +0300)
src/stats/client-export.c
src/stats/mail-command.c
src/stats/mail-domain.c
src/stats/mail-ip.c
src/stats/mail-session.c
src/stats/mail-stats.h
src/stats/mail-user.c

index 104cdd716ca1148e650a712bebd6b5492e2841c8..0a28e6c9218ae7664a3223d39ee6e324d8eff7ac 100644 (file)
@@ -124,7 +124,7 @@ mail_export_filter_match_session(const struct mail_export_filter *filter,
 {
        if (filter->connected && session->disconnected)
                return FALSE;
-       if (filter->since > session->last_update)
+       if (filter->since > session->last_update.tv_sec)
                return FALSE;
        if (filter->user != NULL &&
            !wildcard_match(session->user->name, filter->user))
@@ -171,7 +171,7 @@ static bool
 mail_export_filter_match_user(const struct mail_export_filter *filter,
                              const struct mail_user *user)
 {
-       if (filter->since > user->last_update)
+       if (filter->since > user->last_update.tv_sec)
                return FALSE;
        if (filter->domain != NULL &&
            !wildcard_match(user->domain->name, filter->domain))
@@ -185,7 +185,7 @@ mail_export_filter_match_domain(const struct mail_export_filter *filter,
 {
        struct mail_user *user;
 
-       if (filter->since > domain->last_update)
+       if (filter->since > domain->last_update.tv_sec)
                return FALSE;
        if (filter->domain != NULL &&
            !wildcard_match(domain->name, filter->domain))
@@ -227,7 +227,7 @@ mail_export_filter_match_ip(const struct mail_export_filter *filter,
                if (filter->domain != NULL && !domain_ok)
                        return FALSE;
        }
-       if (filter->since > ip->last_update)
+       if (filter->since > ip->last_update.tv_sec)
                return FALSE;
        if (filter->ip_bits > 0 &&
            !net_is_in_network(&ip->ip, &filter->ip, filter->ip_bits))
@@ -235,6 +235,12 @@ mail_export_filter_match_ip(const struct mail_export_filter *filter,
        return TRUE;
 }
 
+static void client_export_timeval(string_t *str, const struct timeval *tv)
+{
+       str_printfa(str, "\t%ld.%06u", (long)tv->tv_sec,
+                   (unsigned int)tv->tv_usec);
+}
+
 static int client_export_iter_command(struct client *client)
 {
        struct client_export_cmd *cmd = client->cmd_export;
@@ -265,7 +271,7 @@ static int client_export_iter_command(struct client *client)
                        str_append(cmd->str,
                                   guid_128_to_string(command->session->guid));
                } T_END;
-               str_printfa(cmd->str, "\t%ld", (long)command->last_update);
+               client_export_timeval(cmd->str, &command->last_update);
                client_export_mail_stats(cmd->str, &command->stats);
                str_append_c(cmd->str, '\n');
                o_stream_send(client->output, str_data(cmd->str),
@@ -315,10 +321,9 @@ static int client_export_iter_session(struct client *client)
                        str_append_c(cmd->str, '\t');
                        str_tabescape_write(cmd->str, session->service);
                } T_END;
-               str_printfa(cmd->str, "\t%d\t%ld\t%u",
-                           !session->disconnected,
-                           (long)session->last_update,
-                           session->num_cmds);
+               str_printfa(cmd->str, "\t%d", !session->disconnected);
+               client_export_timeval(cmd->str, &session->last_update);
+               str_printfa(cmd->str, "\t%u", session->num_cmds);
                client_export_mail_stats(cmd->str, &session->stats);
                str_append_c(cmd->str, '\n');
                o_stream_send(client->output, str_data(cmd->str),
@@ -356,9 +361,9 @@ static int client_export_iter_user(struct client *client)
 
                str_truncate(cmd->str, 0);
                str_tabescape_write(cmd->str, user->name);
-               str_printfa(cmd->str, "\t%ld\t%ld\t%u\t%u",
-                           (long)user->reset_timestamp,
-                           (long)user->last_update,
+               str_printfa(cmd->str, "\t%ld", (long)user->reset_timestamp);
+               client_export_timeval(cmd->str, &user->last_update);
+               str_printfa(cmd->str, "\t%u\t%u",
                            user->num_logins, user->num_cmds);
                client_export_mail_stats(cmd->str, &user->stats);
                str_append_c(cmd->str, '\n');
@@ -397,9 +402,9 @@ static int client_export_iter_domain(struct client *client)
 
                str_truncate(cmd->str, 0);
                str_tabescape_write(cmd->str, domain->name);
-               str_printfa(cmd->str, "\t%ld\t%ld\t%u\t%u",
-                           (long)domain->reset_timestamp,
-                           (long)domain->last_update,
+               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);
                client_export_mail_stats(cmd->str, &domain->stats);
                str_append_c(cmd->str, '\n');
@@ -440,10 +445,9 @@ static int client_export_iter_ip(struct client *client)
                T_BEGIN {
                        str_append(cmd->str, net_ip2addr(&ip->ip));
                } T_END;
-               str_printfa(cmd->str, "\t%ld\t%ld\t%u\t%u",
-                           (long)ip->reset_timestamp,
-                           (long)ip->last_update,
-                           ip->num_logins, ip->num_cmds);
+               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);
                client_export_mail_stats(cmd->str, &ip->stats);
                str_append_c(cmd->str, '\n');
                o_stream_send(client->output, str_data(cmd->str),
index fe420adf3c5a550781dc263bf10d0c7e9802fc50..ec0e7191c07fd62789a35b53f32692ad673bee43 100644 (file)
@@ -47,7 +47,7 @@ mail_command_add(struct mail_session *session, const char *name,
        cmd->session = session;
        cmd->name = i_strdup(name);
        cmd->args = i_strdup(args);
-       cmd->last_update = ioloop_time;
+       cmd->last_update = ioloop_timeval;
 
        DLLIST_PREPEND_FULL(&stable_mail_commands, cmd,
                            stable_prev, stable_next);
@@ -138,7 +138,7 @@ int mail_command_update_parse(const char *const *args, const char **error_r)
                        *error_r = "UPDATE-SESSION: stats shrank";
                        return -1;
                }
-               cmd->last_update = ioloop_time;
+               cmd->last_update = ioloop_timeval;
                mail_stats_add(&session->stats, &diff_stats);
        }
        if (done) {
@@ -159,7 +159,7 @@ void mail_commands_free_memory(void)
                if (global_used_memory < stats_settings->memory_limit)
                        break;
                if (ioloop_time -
-                   stable_mail_commands->last_update < stats_settings->command_min_time)
+                   stable_mail_commands->last_update.tv_sec < stats_settings->command_min_time)
                        break;
        }
 }
index dbaad3bb0ed2861acc2f43d8832fd67de2eb14ef..49b5350b2886d4b79ec6ef0514960b2ba3962e4a 100644 (file)
@@ -40,7 +40,7 @@ struct mail_domain *mail_domain_login(const char *name)
        DLLIST2_APPEND_FULL(&mail_domains_head, &mail_domains_tail, domain,
                            sorted_prev, sorted_next);
        domain->num_logins++;
-       domain->last_update = ioloop_time;
+       domain->last_update = ioloop_timeval;
        global_memory_alloc(mail_domain_memsize(domain));
        return domain;
 }
@@ -86,7 +86,7 @@ void mail_domain_refresh(struct mail_domain *domain,
 {
        if (diff_stats != NULL)
                mail_stats_add(&domain->stats, diff_stats);
-       domain->last_update = ioloop_time;
+       domain->last_update = ioloop_timeval;
        DLLIST2_REMOVE_FULL(&mail_domains_head, &mail_domains_tail, domain,
                            sorted_prev, sorted_next);
        DLLIST2_APPEND_FULL(&mail_domains_head, &mail_domains_tail, domain,
@@ -101,7 +101,7 @@ void mail_domains_free_memory(void)
                if (global_used_memory < stats_settings->memory_limit)
                        break;
                if (ioloop_time -
-                   mail_domains_head->last_update < stats_settings->domain_min_time)
+                   mail_domains_head->last_update.tv_sec < stats_settings->domain_min_time)
                        break;
        }
 }
index 770869daf393d960afaba6784c7a9588e378d4f1..4227fb6b8da61dc16abd74e9e2c879e661419255 100644 (file)
@@ -39,7 +39,7 @@ 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->last_update = ioloop_time;
+       ip->last_update = ioloop_timeval;
        global_memory_alloc(mail_ip_memsize(ip));
        return ip;
 }
@@ -82,7 +82,7 @@ void mail_ip_refresh(struct mail_ip *ip, const struct mail_stats *diff_stats)
 {
        if (diff_stats != NULL)
                mail_stats_add(&ip->stats, diff_stats);
-       ip->last_update = ioloop_time;
+       ip->last_update = ioloop_timeval;
        DLLIST2_REMOVE_FULL(&mail_ips_head, &mail_ips_tail, ip,
                            sorted_prev, sorted_next);
        DLLIST2_APPEND_FULL(&mail_ips_head, &mail_ips_tail, ip,
@@ -97,7 +97,7 @@ void mail_ips_free_memory(void)
                if (global_used_memory < stats_settings->memory_limit)
                        break;
                if (ioloop_time -
-                   mail_ips_head->last_update < stats_settings->ip_min_time)
+                   mail_ips_head->last_update.tv_sec < stats_settings->ip_min_time)
                        break;
        }
 }
index 1c790705baf1384f728864c9260358977a59a794..92361a9d903639fa7c13de831788ac2e5eccc1ae 100644 (file)
@@ -67,7 +67,7 @@ int mail_session_connect_parse(const char *const *args, const char **error_r)
        session->refcount = 1; /* unrefed at disconnect */
        session->service = i_strdup(args[2]);
        memcpy(session->guid, session_guid, sizeof(session->guid));
-       session->last_update = ioloop_time;
+       session->last_update = ioloop_timeval;
        session->to_idle = timeout_add(MAIL_SESSION_IDLE_TIMEOUT_MSECS,
                                       mail_session_idle_timeout, session);
 
@@ -179,7 +179,7 @@ void mail_session_refresh(struct mail_session *session,
 
        if (diff_stats != NULL)
                mail_stats_add(&session->stats, diff_stats);
-       session->last_update = ioloop_time;
+       session->last_update = ioloop_timeval;
        DLLIST2_REMOVE_FULL(&mail_sessions_head, &mail_sessions_tail, session,
                            sorted_prev, sorted_next);
        DLLIST2_APPEND_FULL(&mail_sessions_head, &mail_sessions_tail, session,
@@ -223,7 +223,7 @@ void mail_sessions_free_memory(void)
                if (global_used_memory < stats_settings->memory_limit)
                        break;
                if (ioloop_time -
-                   mail_sessions_head->last_update < stats_settings->session_min_time)
+                   mail_sessions_head->last_update.tv_sec < stats_settings->session_min_time)
                        break;
        }
 }
index 419fa87718004bc2018e85848b372acc5c2c3d0f..9d8c52b57aae55d28f94e7e1867a36d65191d655 100644 (file)
@@ -23,7 +23,7 @@ struct mail_command {
        /* non-zero id means the command is still running */
        unsigned int id;
 
-       time_t last_update;
+       struct timeval last_update;
        struct mail_stats stats;
 
        int refcount;
@@ -44,7 +44,7 @@ struct mail_session {
        struct timeout *to_idle;
 
        struct mail_stats stats;
-       time_t last_update;
+       struct timeval last_update;
        unsigned int num_cmds;
 
        bool disconnected;
@@ -61,7 +61,7 @@ struct mail_user {
        struct mail_domain *domain;
        time_t reset_timestamp;
 
-       time_t last_update;
+       struct timeval last_update;
        struct mail_stats stats;
        unsigned int num_logins;
        unsigned int num_cmds;
@@ -76,7 +76,7 @@ struct mail_domain {
        char *name;
        time_t reset_timestamp;
 
-       time_t last_update;
+       struct timeval last_update;
        struct mail_stats stats;
        unsigned int num_logins;
        unsigned int num_cmds;
@@ -91,7 +91,7 @@ struct mail_ip {
        struct ip_addr ip;
        time_t reset_timestamp;
 
-       time_t last_update;
+       struct timeval last_update;
        struct mail_stats stats;
        unsigned int num_logins;
        unsigned int num_cmds;
index 9bb9e4599491801783d00604adbf7e204fd92dac..299844f73f72331afe281e04f1187915fc4938db 100644 (file)
@@ -54,7 +54,7 @@ struct mail_user *mail_user_login(const char *username)
        mail_domain_ref(user->domain);
 
        user->num_logins++;
-       user->last_update = ioloop_time;
+       user->last_update = ioloop_timeval;
        global_memory_alloc(mail_user_memsize(user));
        return user;
 }
@@ -102,7 +102,7 @@ void mail_user_refresh(struct mail_user *user,
 {
        if (diff_stats != NULL)
                mail_stats_add(&user->stats, diff_stats);
-       user->last_update = ioloop_time;
+       user->last_update = ioloop_timeval;
        DLLIST2_REMOVE_FULL(&mail_users_head, &mail_users_tail, user,
                            sorted_prev, sorted_next);
        DLLIST2_APPEND_FULL(&mail_users_head, &mail_users_tail, user,
@@ -118,7 +118,7 @@ void mail_users_free_memory(void)
                if (global_used_memory < stats_settings->memory_limit)
                        break;
                if (ioloop_time -
-                   mail_users_head->last_update < stats_settings->user_min_time)
+                   mail_users_head->last_update.tv_sec < stats_settings->user_min_time)
                        break;
        }
 }