Code

store: Don't change the interval if the new interval is zero.
authorSebastian Harl <sh@tokkee.org>
Sun, 6 Apr 2014 11:46:37 +0000 (13:46 +0200)
committerSebastian Harl <sh@tokkee.org>
Sun, 6 Apr 2014 11:46:37 +0000 (13:46 +0200)
If the interval is zero, multiple updates happened at the same time. This does
not affect the interval at which the object is updated in the backend, though.

src/core/store.c
t/core/store_test.c

index fd08de9101272dfafa7e7b0e6f8e4dbe1d626675..dace58f899f78ac27d681f22927ed088a7850170 100644 (file)
@@ -295,11 +295,13 @@ store_obj(int parent_type, const char *parent_name,
                else {
                        sdb_time_t interval = last_update - old->last_update;
                        old->last_update = last_update;
-                       if (old->interval)
-                               old->interval = (sdb_time_t)((0.9 * (double)old->interval)
-                                               + (0.1 * (double)interval));
-                       else
-                               old->interval = interval;
+                       if (interval) {
+                               if (old->interval)
+                                       old->interval = (sdb_time_t)((0.9 * (double)old->interval)
+                                                       + (0.1 * (double)interval));
+                               else
+                                       old->interval = interval;
+                       }
                }
 
                if (updated_obj)
index d57747fcd9151f99e4aeb15d05639b537de1d2d0..29c5b1b67d7a8eee65639078e65fc7800f6a0bcf 100644 (file)
@@ -385,6 +385,28 @@ START_TEST(test_interval)
                        "sdb_store_host() did not calculate interval correctly: "
                        "got: %"PRIscTIME"; expected: %"PRIscTIME, host->interval, 10);
 
+       /* multiple updates for the same timestamp don't modify the interval */
+       sdb_store_host("host", 40);
+       sdb_store_host("host", 40);
+       sdb_store_host("host", 40);
+       sdb_store_host("host", 40);
+
+       fail_unless(host->interval == 10,
+                       "sdb_store_host() changed interval when doing multiple updates "
+                       "using the same timestamp; got: %"PRIscTIME"; "
+                       "expected: %"PRIscTIME, host->interval, 10);
+
+       /* multiple updates using an timestamp don't modify the interval */
+       sdb_store_host("host", 20);
+       sdb_store_host("host", 20);
+       sdb_store_host("host", 20);
+       sdb_store_host("host", 20);
+
+       fail_unless(host->interval == 10,
+                       "sdb_store_host() changed interval when doing multiple updates "
+                       "using an old timestamp; got: %"PRIscTIME"; expected: %"PRIscTIME,
+                       host->interval, 10);
+
        /* new interval: 20 us */
        sdb_store_host("host", 60);
        fail_unless(host->interval == 11,