]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib,stats,dict: Make stats_dist_get_avg() return double
authorMartti Rannanjärvi <martti.rannanjarvi@dovecot.fi>
Mon, 20 Aug 2018 10:56:40 +0000 (13:56 +0300)
committerVille Savolainen <ville.savolainen@dovecot.fi>
Tue, 13 Nov 2018 12:14:55 +0000 (14:14 +0200)
src/dict/main.c
src/lib/stats-dist.c
src/lib/stats-dist.h
src/lib/test-stats-dist.c
src/stats/client-reader.c

index f298235e6bb2d678899557376c914f7df1f906dd..4549c25f1a90ecfda0d1f955f9dad55bc16c97ad 100644 (file)
@@ -27,7 +27,7 @@ static bool proctitle_updated;
 static void
 add_stats_string(string_t *str, struct stats_dist *stats, const char *name)
 {
-       str_printfa(str, ", %u %s:%"PRIu64"/%"PRIu64"/%"PRIu64"/%"PRIu64,
+       str_printfa(str, ", %u %s:%"PRIu64"/%.02f/%"PRIu64"/%"PRIu64,
                    stats_dist_get_count(stats), name,
                    stats_dist_get_min(stats)/1000, stats_dist_get_avg(stats)/1000,
                    stats_dist_get_95th(stats)/1000, stats_dist_get_max(stats)/1000);
index 48816627d8c80e118eb98436d97a6015c4d6672e..2446e1d568c7d9cc506b153142cb62f45608ffff 100644 (file)
@@ -87,12 +87,12 @@ uint64_t stats_dist_get_max(const struct stats_dist *stats)
        return stats->max;
 }
 
-uint64_t stats_dist_get_avg(const struct stats_dist *stats)
+double stats_dist_get_avg(const struct stats_dist *stats)
 {
        if (stats->count == 0)
                return 0;
 
-       return (stats->sum + stats->count/2) / stats->count;
+       return (double)stats->sum / stats->count;
 }
 
 static void stats_dist_ensure_sorted(struct stats_dist *stats)
@@ -127,7 +127,7 @@ double stats_dist_get_variance(const struct stats_dist *stats)
        if (stats->count == 0)
                return 0;
 
-       double avg = (double)(int64_t)stats_dist_get_avg(stats);
+       double avg = stats_dist_get_avg(stats);
        double count = (stats->count < stats->sample_count)
                ? stats->count
                : stats->sample_count;
index e21e638b859c4daffba1fc5b4161917b89173032..82d53597af67d9960ee97e86da9883efa636a433 100644 (file)
@@ -21,7 +21,7 @@ uint64_t stats_dist_get_min(const struct stats_dist *stats);
 /* Returns events' maximum. */
 uint64_t stats_dist_get_max(const struct stats_dist *stats);
 /* Returns events' average. */
-uint64_t stats_dist_get_avg(const struct stats_dist *stats);
+double stats_dist_get_avg(const struct stats_dist *stats);
 /* Returns events' approximate (through random subsampling) median. */
 uint64_t stats_dist_get_median(const struct stats_dist *stats);
 /* Returns events' variance */
index cd2fa4fa9fb8c1f06322f60c2c378b354b9826a3..8a7b14ee855e5e6cef0284df6ca429908b7059f4 100644 (file)
@@ -3,6 +3,9 @@
 #include "test-lib.h"
 #include "stats-dist.h"
 #include "sort.h"
+#include "math.h"
+
+#define DBL_EQ(a, b) (fabs((a)-(b)) < 0.001)
 
 static void
 test_stats_dist_verify(const struct stats_dist *t, const int64_t *input,
@@ -31,7 +34,8 @@ test_stats_dist_verify(const struct stats_dist *t, const int64_t *input,
        test_assert_idx(stats_dist_get_sum(t) == sum, input_size);
        test_assert_idx(stats_dist_get_min(t)  == min, input_size);
        test_assert_idx(stats_dist_get_max(t) == max, input_size);
-       test_assert_idx(stats_dist_get_avg(t) == (sum + input_size/2)/input_size, input_size);
+       test_assert_idx(DBL_EQ(stats_dist_get_avg(t), (double)sum/input_size),
+                       input_size);
 
        /* these aren't always fully accurate: */
        test_assert_idx(stats_dist_get_median(t) >= copy[(input_size-1)/2] &&
@@ -86,7 +90,7 @@ void test_stats_dist(void)
        test_assert(stats_dist_get_sum(t) == (i-1)*i/2);
        test_assert(stats_dist_get_min(t) == 0);
        test_assert(stats_dist_get_max(t) == i-1);
-       test_assert(stats_dist_get_avg(t) == i/2);
+       test_assert(DBL_EQ(stats_dist_get_avg(t), 4999.500000));
        /* just test that these work: */
        test_assert(stats_dist_get_median(t) > 0 && stats_dist_get_median(t) < i-1);
        test_assert(stats_dist_get_95th(t) > 0 && stats_dist_get_95th(t) < i-1);
index d4be3b825838d6faeb51e40ac79345da44b5883a..84423e0c87a897444496c610e3cafb8f236078ad 100644 (file)
@@ -51,7 +51,7 @@ static void reader_client_dump_stats(string_t *str, struct stats_dist *stats,
                else if (strcmp(field, "max") == 0)
                        str_printfa(str, "%"PRIu64, stats_dist_get_max(stats));
                else if (strcmp(field, "avg") == 0)
-                       str_printfa(str, "%"PRIu64, stats_dist_get_avg(stats));
+                       str_printfa(str, "%.02f", stats_dist_get_avg(stats));
                else if (strcmp(field, "median") == 0)
                        str_printfa(str, "%"PRIu64, stats_dist_get_median(stats));
                else if (strcmp(field, "variance") == 0)