From: Timo Sirainen Date: Thu, 1 Sep 2011 07:40:17 +0000 (+0300) Subject: stats: Keep track of last_update in microsecond precision and export it as such. X-Git-Tag: 2.1.alpha1~6 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=699b2bf7be05e116c1ba517e2fece1cd45ee0582;p=thirdparty%2Fdovecot%2Fcore.git stats: Keep track of last_update in microsecond precision and export it as such. --- diff --git a/src/stats/client-export.c b/src/stats/client-export.c index 104cdd716c..0a28e6c921 100644 --- a/src/stats/client-export.c +++ b/src/stats/client-export.c @@ -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), diff --git a/src/stats/mail-command.c b/src/stats/mail-command.c index fe420adf3c..ec0e7191c0 100644 --- a/src/stats/mail-command.c +++ b/src/stats/mail-command.c @@ -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; } } diff --git a/src/stats/mail-domain.c b/src/stats/mail-domain.c index dbaad3bb0e..49b5350b28 100644 --- a/src/stats/mail-domain.c +++ b/src/stats/mail-domain.c @@ -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; } } diff --git a/src/stats/mail-ip.c b/src/stats/mail-ip.c index 770869daf3..4227fb6b8d 100644 --- a/src/stats/mail-ip.c +++ b/src/stats/mail-ip.c @@ -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; } } diff --git a/src/stats/mail-session.c b/src/stats/mail-session.c index 1c790705ba..92361a9d90 100644 --- a/src/stats/mail-session.c +++ b/src/stats/mail-session.c @@ -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; } } diff --git a/src/stats/mail-stats.h b/src/stats/mail-stats.h index 419fa87718..9d8c52b57a 100644 --- a/src/stats/mail-stats.h +++ b/src/stats/mail-stats.h @@ -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; diff --git a/src/stats/mail-user.c b/src/stats/mail-user.c index 9bb9e45994..299844f73f 100644 --- a/src/stats/mail-user.c +++ b/src/stats/mail-user.c @@ -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; } }