]> granicus.if.org Git - vnstat/commitdiff
adjust UpdateInterval during daemon startup if found to be too high compared to MaxBa...
authorTeemu Toivola <git@humdi.net>
Wed, 24 Apr 2019 11:52:17 +0000 (14:52 +0300)
committerTeemu Toivola <git@humdi.net>
Wed, 24 Apr 2019 11:52:17 +0000 (14:52 +0300)
CHANGES
src/cfg.c
tests/config_tests.c

diff --git a/CHANGES b/CHANGES
index 647efc6122405f0a3bc52cce1dbf4bf6aa40f4f9..b1ceb4110a17ff084a01fb6355f9f3e93c18163e 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -12,6 +12,8 @@
    - Highlight current day in top list when visible
    - Changes in interface specific detected bandwidth limits are reported
      in the log
+   - UpdateInterval value is automatically adjusted during daemon startup if
+     found to be too high compared to the value of MaxBandwidth
  - Notes
    - Added clarification to the man page that the 'jsonversion' and
      'xmlversion' fields in the --json and --xml outputs should be seen as
index 5faaef66edc15679bb9f3a9534e7c84bbc04e9de..0f5a46b2ea1e8b4aa82fcc601c32402bb04c27cb 100644 (file)
--- a/src/cfg.c
+++ b/src/cfg.c
@@ -166,6 +166,7 @@ void validateint(const char *cfgname, int32_t *cfgptr, const int32_t defaultvalu
 
 void validatecfg(void)
 {
+       uint32_t rolloversecs;
        const char *invalidvalue = "Invalid value for";
        const char *resettingto = "resetting to";
        const char *noslashstart = "doesn't start with \"/\", resetting to default.";
@@ -255,6 +256,21 @@ void validatecfg(void)
                snprintf(errorstring, 1024, "%s OfflineSaveInterval, %s \"%d\".", invalidvalue, resettingto, cfg.offsaveinterval);
                printe(PT_Config);
        }
+
+       /* enforce update interval to be short enough that 32-bit interface counter rollover can be detected */
+       /* 1.02 is the same 2% safety buffer as used in processifinfo() in daemon.c */
+       /* noexit check results in warning being shown only when the daemon is started */
+       if (noexit && cfg.maxbw > 0) {
+               rolloversecs = (uint32_t)(MAX32 / (cfg.maxbw * 1024 * 1024 * (float)1.02 / 8));
+               if (rolloversecs <= (uint32_t)cfg.updateinterval) {
+                       cfg.updateinterval = UPDATEINTERVAL;
+                       if (rolloversecs <= (uint32_t)cfg.updateinterval) {
+                               cfg.updateinterval /= 2;
+                       }
+                       snprintf(errorstring, 1024, "UpdateInterval has been reset to %d seconds in order to ensure correct counter rollover detection at %d Mbit.", cfg.updateinterval, cfg.maxbw);
+                       printe(PT_Config);
+               }
+       }
 }
 
 void defaultcfg(void)
index c7bd2b28b316fec8ee026888d0e8813da46d015b..664862365c564d2693284b46978b15d99e92ae0f 100644 (file)
@@ -37,6 +37,35 @@ START_TEST(validatecfg_restores_invalid_values_back_to_default)
 }
 END_TEST
 
+START_TEST(validatecfg_can_tune_updateinterval_to_avoid_rollover_issues)
+{
+       noexit = 1;
+       defaultcfg();
+       cfg.updateinterval = 60;
+       cfg.maxbw = 1000;
+       cfg.bwdetection = 1;
+       suppress_output();
+       validatecfg();
+       ck_assert_int_ne(cfg.updateinterval, 60);
+       ck_assert_int_eq(cfg.updateinterval, UPDATEINTERVAL);
+}
+END_TEST
+
+START_TEST(validatecfg_has_fallback_for_updateinterval_for_very_fast_interfaces)
+{
+       noexit = 1;
+       defaultcfg();
+       cfg.updateinterval = 60;
+       cfg.maxbw = 2000;
+       cfg.bwdetection = 1;
+       suppress_output();
+       validatecfg();
+       ck_assert_int_ne(cfg.updateinterval, 60);
+       ck_assert_int_ne(cfg.updateinterval, UPDATEINTERVAL);
+       ck_assert_int_eq(cfg.updateinterval, (UPDATEINTERVAL / 2));
+}
+END_TEST
+
 START_TEST(printcfgfile_default)
 {
        defaultcfg();
@@ -492,6 +521,8 @@ void add_config_tests(Suite *s)
        tcase_add_test(tc_config, validatecfg_default);
        tcase_add_test(tc_config, validatecfg_does_not_modify_valid_changes);
        tcase_add_test(tc_config, validatecfg_restores_invalid_values_back_to_default);
+       tcase_add_test(tc_config, validatecfg_can_tune_updateinterval_to_avoid_rollover_issues);
+       tcase_add_test(tc_config, validatecfg_has_fallback_for_updateinterval_for_very_fast_interfaces);
        tcase_add_test(tc_config, printcfgfile_default);
        tcase_add_test(tc_config, loadcfg_included_default);
        tcase_add_test(tc_config, loadcfg_no_file);