fixes a bug in the incremental algorithm that was introduced yesterday and made all multi-dimensional charts show wrong values for all dimensions except the first
Costa Tsaousis (ktsaou) committed
Sep 24, 2016 at 03:13 UTC
6087b1b6b8d496a84b3927200e93f9547677ba1e
2 files changed
+49
-3
src/rrd.c
+3
-3
@@ -937,6 +937,8 @@ collected_number rrddim_set_by_pointer(RRDSET *st, RRDDIM *rd, collected_number
937
rd->updated = 1;
938
rd->counter++;
939
940
+ // fprintf(stderr, "%s.%s %llu " COLLECTED_NUMBER_FORMAT " dt %0.6f" " rate " CALCULATED_NUMBER_FORMAT "\n", st->name, rd->name, st->usec_since_last_update, value, (float)((double)st->usec_since_last_update / (double)1000000), (calculated_number)((value - rd->last_collected_value) * (calculated_number)rd->multiplier / (calculated_number)rd->divisor * 1000000.0 / (calculated_number)st->usec_since_last_update));
941
+
942
return rd->last_collected_value;
943
}
944
@@ -1294,7 +1296,7 @@ unsigned long long rrdset_done(RRDSET *st)
1296
long long iterations = (now_collect_ut - last_stored_ut) / (update_every_ut);
1297
if((now_collect_ut % (update_every_ut)) == 0) iterations++;
1298
1297
- for( ; next_store_ut <= now_collect_ut ; next_store_ut += update_every_ut, iterations-- ) {
1299
+ for( ; next_store_ut <= now_collect_ut ; last_collect_ut = next_store_ut, next_store_ut += update_every_ut, iterations-- ) {
1300
#ifdef NETDATA_INTERNAL_CHECKS
1301
if(iterations < 0) { error("%s: iterations calculation wrapped! first_ut = %llu, last_stored_ut = %llu, next_store_ut = %llu, now_collect_ut = %llu", st->name, first_ut, last_stored_ut, next_store_ut, now_collect_ut); }
1302
#endif
@@ -1344,8 +1346,6 @@ unsigned long long rrdset_done(RRDSET *st)
1346
);
1347
new_value = new_value * (calculated_number)(st->update_every * 1000000) / (calculated_number)(next_store_ut - last_stored_ut);
1348
}
1347
-
1348
- last_collect_ut = next_store_ut;
1349
break;
1350
1351
case RRDDIM_ABSOLUTE:
src/unit_test.c
+46
@@ -835,6 +835,49 @@ struct test test14c = {
835
NULL // results2
836
};
837
838
+// --------------------------------------------------------------------------------------------------------------------
839
+// test15
840
+
841
+struct feed_values test15_feed[] = {
842
+ { 0, 1068066388 },
843
+ { 1008752, 1068822698 },
844
+ { 993809, 1069573072 },
845
+ { 995911, 1070324135 },
846
+ { 1014562, 1071078166 },
847
+ { 994684, 1071831349 },
848
+ { 993128, 1072235739 },
849
+ { 1010332, 1072958871 },
850
+ { 1003394, 1073707019 },
851
+ { 995201, 1074460255 },
852
+};
853
+
854
+collected_number test15_feed2[] = {
855
+ 178825286, 178825286, 178825286, 178825286, 178825498, 178825498, 179165652, 179202964, 179203282, 179204130
856
+};
857
+
858
+calculated_number test15_results[] = {
859
+ 5857.4080000, 5898.4540000, 5891.6590000, 5806.3160000, 5914.2640000, 3202.2630000, 5589.6560000, 5822.5260000, 5911.7520000
860
+};
861
+
862
+calculated_number test15_results2[] = {
863
+ 0.0000000, 0.0000000, 0.0024944, 1.6324779, 0.0212777, 2655.1890000, 290.5387000, 5.6733610, 6.5960220
864
+};
865
+
866
+struct test test15 = {
867
+ "test15", // name
868
+ "test incremental with 2 dimensions",
869
+ 1, // update_every
870
+ 8, // multiplier
871
+ 1024, // divisor
872
+ RRDDIM_INCREMENTAL, // algorithm
873
+ 10, // feed entries
874
+ 9, // result entries
875
+ test15_feed, // feed
876
+ test15_results, // results
877
+ test15_feed2, // feed2
878
+ test15_results2 // results2
879
+};
880
+
881
// --------------------------------------------------------------------------------------------------------------------
882
883
int run_test(struct test *test)
@@ -982,6 +1025,9 @@ int run_all_mockup_tests(void)
1025
if(run_test(&test14c))
1026
return 1;
1027
1028
+ if(run_test(&test15))
1029
+ return 1;
1030
+
1031
return 0;
1032
}
1033