@cryptotaxi247 / netdata-1 / commits / 6087b1b6b

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