From 558bae256922e3c4149fd9798dbd98b04bd5cc55 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Tue, 24 Jul 2018 19:48:08 +0100 Subject: [PATCH] [Minor] Place moving average function is generic utilities --- src/libserver/symbols_cache.c | 58 +++-------------------------------- src/libutil/util.c | 42 ++++++++++++++++++++++++- src/libutil/util.h | 26 ++++++++++++++++ 3 files changed, 71 insertions(+), 55 deletions(-) diff --git a/src/libserver/symbols_cache.c b/src/libserver/symbols_cache.c index 943125287..6076d1743 100644 --- a/src/libserver/symbols_cache.c +++ b/src/libserver/symbols_cache.c @@ -85,19 +85,13 @@ struct symbols_cache { gint peak_cb; }; -struct counter_data { - gdouble mean; - gdouble stddev; - guint64 number; -}; - struct item_stat { - struct counter_data time_counter; + struct rspamd_counter_data time_counter; gdouble avg_time; gdouble weight; guint hits; guint64 total_hits; - struct counter_data frequency_counter; + struct rspamd_counter_data frequency_counter; gdouble avg_frequency; gdouble stddev_frequency; }; @@ -109,7 +103,7 @@ struct cache_item { guint64 last_count; /* Per process counter */ - struct counter_data *cd; + struct rspamd_counter_data *cd; gchar *symbol; enum rspamd_symbol_type type; @@ -338,50 +332,6 @@ cache_logic_cmp (const void *p1, const void *p2, gpointer ud) return 0; } -/** - * Set counter for a symbol using moving average - */ -static double -rspamd_set_counter (struct counter_data *cd, gdouble value) -{ - gdouble cerr; - - /* Cumulative moving average using per-process counter data */ - if (cd->number == 0) { - cd->mean = 0; - cd->stddev = 0; - } - - cd->mean += (value - cd->mean) / (gdouble)(++cd->number); - cerr = (value - cd->mean) * (value - cd->mean); - cd->stddev += (cerr - cd->stddev) / (gdouble)(cd->number); - - return cd->mean; -} - -/** - * Set counter for a symbol using exponential moving average - */ -static double -rspamd_set_counter_ema (struct counter_data *cd, gdouble value, gdouble alpha) -{ - gdouble diff, incr; - - /* Cumulative moving average using per-process counter data */ - if (cd->number == 0) { - cd->mean = 0; - cd->stddev = 0; - } - - diff = value - cd->mean; - incr = diff * alpha; - cd->mean += incr; - cd->stddev = (1 - alpha) * (cd->stddev + diff * incr); - cd->number ++; - - return cd->mean; -} - static void rspamd_symbols_cache_tsort_visit (struct symbols_cache *cache, struct cache_item *it, @@ -874,7 +824,7 @@ rspamd_symbols_cache_add_symbol (struct symbols_cache *cache, * save or accumulate */ item->cd = rspamd_mempool_alloc0 (cache->static_pool, - sizeof (struct counter_data)); + sizeof (struct rspamd_counter_data)); item->func = func; item->user_data = user_data; item->priority = priority; diff --git a/src/libutil/util.c b/src/libutil/util.c index 93f449791..6554da63b 100644 --- a/src/libutil/util.c +++ b/src/libutil/util.c @@ -2973,4 +2973,44 @@ rspamd_glob_path (const gchar *dir, } return res; -} \ No newline at end of file +} + +double +rspamd_set_counter (struct rspamd_counter_data *cd, gdouble value) +{ + gdouble cerr; + + /* Cumulative moving average using per-process counter data */ + if (cd->number == 0) { + cd->mean = 0; + cd->stddev = 0; + } + + cd->mean += (value - cd->mean) / (gdouble)(++cd->number); + cerr = (value - cd->mean) * (value - cd->mean); + cd->stddev += (cerr - cd->stddev) / (gdouble)(cd->number); + + return cd->mean; +} + +double +rspamd_set_counter_ema (struct rspamd_counter_data *cd, + gdouble value, + gdouble alpha) +{ + gdouble diff, incr; + + /* Cumulative moving average using per-process counter data */ + if (cd->number == 0) { + cd->mean = 0; + cd->stddev = 0; + } + + diff = value - cd->mean; + incr = diff * alpha; + cd->mean += incr; + cd->stddev = (1 - alpha) * (cd->stddev + diff * incr); + cd->number ++; + + return cd->mean; +} diff --git a/src/libutil/util.h b/src/libutil/util.h index 5968094a9..4338d5557 100644 --- a/src/libutil/util.h +++ b/src/libutil/util.h @@ -511,4 +511,30 @@ GPtrArray *rspamd_glob_path (const gchar *dir, gboolean recursive, GError **err); +struct rspamd_counter_data { + gdouble mean; + gdouble stddev; + guint64 number; +}; + +/** + * Sets counter's data using exponential moving average + * @param cd counter + * @param value new counter value + * @param alpha decay coefficient (0..1) + * @return new counter value + */ +double rspamd_set_counter_ema (struct rspamd_counter_data *cd, + gdouble value, + gdouble alpha); + +/** + * Sets counter's data using flat moving average + * @param cd counter + * @param value new counter value + * @return new counter value + */ +double rspamd_set_counter (struct rspamd_counter_data *cd, + gdouble value); + #endif -- 2.39.5