]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
stats: Log more verbosely what happened if stats shrink.
authorTimo Sirainen <tss@iki.fi>
Thu, 1 Sep 2011 14:52:51 +0000 (17:52 +0300)
committerTimo Sirainen <tss@iki.fi>
Thu, 1 Sep 2011 14:52:51 +0000 (17:52 +0300)
src/stats/mail-command.c
src/stats/mail-session.c
src/stats/mail-stats.c
src/stats/mail-stats.h

index ec0e7191c07fd62789a35b53f32692ad673bee43..10276937c87bf9d5177ae3e99297a0f412b91517 100644 (file)
@@ -94,6 +94,7 @@ int mail_command_update_parse(const char *const *args, const char **error_r)
        struct mail_session *session;
        struct mail_command *cmd;
        struct mail_stats stats, diff_stats;
+       const char *error;
        unsigned int cmd_id;
        bool done;
        int ret;
@@ -134,8 +135,10 @@ int mail_command_update_parse(const char *const *args, const char **error_r)
                if (session->ip != NULL)
                        session->ip->num_cmds++;
        } else {
-               if (!mail_stats_diff(&cmd->stats, &stats, &diff_stats)) {
-                       *error_r = "UPDATE-SESSION: stats shrank";
+               if (!mail_stats_diff(&cmd->stats, &stats, &diff_stats,
+                                    &error)) {
+                       *error_r = t_strconcat("UPDATE-SESSION: stats shrank: ",
+                                              error, NULL);
                        return -1;
                }
                cmd->last_update = ioloop_timeval;
index 9a48e540807e3654ae8b4378d55730bca217dffb..92b92809e7edf4a88df2315f1c904c92ad0a6279 100644 (file)
@@ -201,6 +201,7 @@ int mail_session_update_parse(const char *const *args, const char **error_r)
 {
        struct mail_session *session;
        struct mail_stats stats, diff_stats;
+       const char *error;
        int ret;
 
        /* <session guid> [key=value ..] */
@@ -212,8 +213,9 @@ int mail_session_update_parse(const char *const *args, const char **error_r)
                return -1;
        }
 
-       if (!mail_stats_diff(&session->stats, &stats, &diff_stats)) {
-               *error_r = "UPDATE-SESSION: stats shrank";
+       if (!mail_stats_diff(&session->stats, &stats, &diff_stats, &error)) {
+               *error_r = t_strconcat("UPDATE-SESSION: stats shrank: ",
+                                      error, NULL);
                return -1;
        }
        mail_session_refresh(session, &diff_stats);
index 3e6f5ee8d43a7b9765f90a66a8cdad15b2c1837e..04d5f8a8375f690465c4d96977701935664222b7 100644 (file)
@@ -162,7 +162,7 @@ mail_stats_diff_uint64(uint64_t *dest, const uint64_t *src1,
 
 bool mail_stats_diff(const struct mail_stats *stats1,
                     const struct mail_stats *stats2,
-                    struct mail_stats *diff_stats_r)
+                    struct mail_stats *diff_stats_r, const char **error_r)
 {
        unsigned int i;
 
@@ -178,20 +178,39 @@ bool mail_stats_diff(const struct mail_stats *stats1,
                case TYPE_NUM:
                        switch (parse_map[i].size) {
                        case sizeof(uint32_t):
-                               if (!mail_stats_diff_uint32(dest, src1, src2))
+                               if (!mail_stats_diff_uint32(dest, src1, src2)) {
+                                       *error_r = t_strdup_printf("%s %u < %u",
+                                               parse_map[i].name,
+                                               *(const uint32_t *)src2,
+                                               *(const uint32_t *)src1);
                                        return FALSE;
+                               }
                                break;
                        case sizeof(uint64_t):
-                               if (!mail_stats_diff_uint64(dest, src1, src2))
+                               if (!mail_stats_diff_uint64(dest, src1, src2)) {
+                                       const uint64_t *n1 = src1, *n2 = src2;
+
+                                       *error_r = t_strdup_printf("%s %llu < %llu",
+                                               parse_map[i].name,
+                                               (unsigned long long)n2,
+                                               (unsigned long long)n1);
                                        return FALSE;
+                               }
                                break;
                        default:
                                i_unreached();
                        }
                        break;
                case TYPE_TIMEVAL:
-                       if (!mail_stats_diff_timeval(dest, src1, src2))
+                       if (!mail_stats_diff_timeval(dest, src1, src2)) {
+                               const struct timeval *tv1 = src1, *tv2 = src2;
+
+                               *error_r = t_strdup_printf("%s %ld.%d < %ld.%d",
+                                       parse_map[i].name,
+                                       (long)tv2->tv_sec, (int)tv2->tv_usec,
+                                       (long)tv1->tv_sec, (int)tv1->tv_usec);
                                return FALSE;
+                       }
                        break;
                }
        }
index 2961881856a7dfca94b01b8ba6a9d7a7be9e5456..d00d8884b5786b950a152cbc7336acc4e2688bab 100644 (file)
@@ -107,7 +107,7 @@ int mail_stats_parse(const char *const *args, struct mail_stats *stats_r,
    is so, FALSE if not */
 bool mail_stats_diff(const struct mail_stats *stats1,
                     const struct mail_stats *stats2,
-                    struct mail_stats *diff_stats_r);
+                    struct mail_stats *diff_stats_r, const char **error_r);
 void mail_stats_add(struct mail_stats *dest, const struct mail_stats *src);
 
 #endif