@cryptotaxi247 / netdata-1 / commits / f5abfad0e

Add variants of functions allowing callers to specify the time to use. (#13791)

Add variants of functions allowing callers to specify the timeval to use. These functions will be prove helfupl in writting tests that are both (a) memory mode agnostic, and (b) oblivious of rrd internals.

vkalintiris committed Oct 14, 2022 at 15:53 UTC f5abfad0e0af633737e42bfab66923956a3edcf5
3 files changed +64 -43
database/rrd.h
+6
@@ -1212,8 +1212,10 @@ static inline RRDSET *rrdset_find_active_byname_localhost(const char *name)
1212
1213 void rrdset_next_usec_unfiltered(RRDSET *st, usec_t microseconds);
1214 void rrdset_next_usec(RRDSET *st, usec_t microseconds);
1215 +void rrdset_timed_next(RRDSET *st, struct timeval now, usec_t microseconds);
1216 #define rrdset_next(st) rrdset_next_usec(st, 0ULL)
1217
1218 +void rrdset_timed_done(RRDSET *st, struct timeval now);
1219 void rrdset_done(RRDSET *st);
1220
1221 void rrdset_is_obsolete(RRDSET *st);
@@ -1259,13 +1261,17 @@ int rrddim_unhide(RRDSET *st, const char *id);
1261 void rrddim_is_obsolete(RRDSET *st, RRDDIM *rd);
1262 void rrddim_isnot_obsolete(RRDSET *st, RRDDIM *rd);
1263
1264 +collected_number rrddim_timed_set_by_pointer(RRDSET *st, RRDDIM *rd, struct timeval collected_time, collected_number value);
1265 collected_number rrddim_set_by_pointer(RRDSET *st, RRDDIM *rd, collected_number value);
1266 collected_number rrddim_set(RRDSET *st, const char *id, collected_number value);
1267 +
1268 #ifdef ENABLE_ACLK
1269 time_t calc_dimension_liveness(RRDDIM *rd, time_t now);
1270 #endif
1271 long align_entries_to_pagesize(RRD_MEMORY_MODE mode, long entries);
1272
1273 +void rrddim_store_metric(RRDDIM *rd, usec_t point_end_time_ut, NETDATA_DOUBLE n, SN_FLAGS flags);
1274 +
1275 // ----------------------------------------------------------------------------
1276 // Miscellaneous functions
1277
database/rrddim.c
+12 -6
@@ -549,23 +549,29 @@ inline void rrddim_isnot_obsolete(RRDSET *st __maybe_unused, RRDDIM *rd) {
549 // ----------------------------------------------------------------------------
550 // RRDDIM - collect values for a dimension
551
552 -inline collected_number rrddim_set_by_pointer(RRDSET *st __maybe_unused, RRDDIM *rd, collected_number value) {
552 +inline collected_number rrddim_set_by_pointer(RRDSET *st, RRDDIM *rd, collected_number value) {
553 + struct timeval now;
554 + now_realtime_timeval(&now);
555 +
556 + return rrddim_timed_set_by_pointer(st, rd, now, value);
557 +}
558 +
559 +collected_number rrddim_timed_set_by_pointer(RRDSET *st __maybe_unused, RRDDIM *rd, struct timeval collected_time, collected_number value) {
560 debug(D_RRD_CALLS, "rrddim_set_by_pointer() for chart %s, dimension %s, value " COLLECTED_NUMBER_FORMAT, rrdset_name(st), rrddim_name(rd), value);
561
555 - now_realtime_timeval(&rd->last_collected_time);
562 + rd->last_collected_time = collected_time;
563 rd->collected_value = value;
564 rd->updated = 1;
558 -
565 rd->collections_counter++;
566
567 collected_number v = (value >= 0) ? value : -value;
562 - if(unlikely(v > rd->collected_value_max)) rd->collected_value_max = v;
563 -
564 - // fprintf(stderr, "%s.%s %llu " COLLECTED_NUMBER_FORMAT " dt %0.6f" " rate " NETDATA_DOUBLE_FORMAT "\n", st->name, rd->name, st->usec_since_last_update, value, (float)((double)st->usec_since_last_update / (double)1000000), (NETDATA_DOUBLE)((value - rd->last_collected_value) * (NETDATA_DOUBLE)rd->multiplier / (NETDATA_DOUBLE)rd->divisor * 1000000.0 / (NETDATA_DOUBLE)st->usec_since_last_update));
568 + if (unlikely(v > rd->collected_value_max))
569 + rd->collected_value_max = v;
570
571 return rd->last_collected_value;
572 }
573
574 +
575 collected_number rrddim_set(RRDSET *st, const char *id, collected_number value) {
576 RRDHOST *host = st->rrdhost;
577 RRDDIM *rd = rrddim_find(st, id);
database/rrdset.c
+46 -37
@@ -860,31 +860,18 @@ RRDSET *rrdset_create_custom(
860 // ----------------------------------------------------------------------------
861 // RRDSET - data collection iteration control
862
863 -inline void rrdset_next_usec_unfiltered(RRDSET *st, usec_t microseconds) {
864 - if(unlikely(!st->last_collected_time.tv_sec || !microseconds || (rrdset_flag_check(st, RRDSET_FLAG_SYNC_CLOCK)))) {
865 - // call the full next_usec() function
866 - rrdset_next_usec(st, microseconds);
867 - return;
868 - }
869 -
870 - st->usec_since_last_update = microseconds;
871 -}
872 -
873 -inline void rrdset_next_usec(RRDSET *st, usec_t microseconds) {
874 - struct timeval now;
875 - now_realtime_timeval(&now);
876 -
863 +void rrdset_timed_next(RRDSET *st, struct timeval now, usec_t duration_since_last_update) {
864 #ifdef NETDATA_INTERNAL_CHECKS
865 char *discard_reason = NULL;
879 - usec_t discarded = microseconds;
866 + usec_t discarded = duration_since_last_update;
867 #endif
868
869 if(unlikely(rrdset_flag_check(st, RRDSET_FLAG_SYNC_CLOCK))) {
870 // the chart needs to be re-synced to current time
871 rrdset_flag_clear(st, RRDSET_FLAG_SYNC_CLOCK);
872
886 - // discard the microseconds supplied
887 - microseconds = 0;
873 + // discard the duration supplied
874 + duration_since_last_update = 0;
875
876 #ifdef NETDATA_INTERNAL_CHECKS
877 if(!discard_reason) discard_reason = "SYNC CLOCK FLAG";
@@ -893,14 +880,14 @@ inline void rrdset_next_usec(RRDSET *st, usec_t microseconds) {
880
881 if(unlikely(!st->last_collected_time.tv_sec)) {
882 // the first entry
896 - microseconds = st->update_every * USEC_PER_SEC;
883 + duration_since_last_update = st->update_every * USEC_PER_SEC;
884 #ifdef NETDATA_INTERNAL_CHECKS
885 if(!discard_reason) discard_reason = "FIRST DATA COLLECTION";
886 #endif
887 }
901 - else if(unlikely(!microseconds)) {
888 + else if(unlikely(!duration_since_last_update)) {
889 // no dt given by the plugin
903 - microseconds = dt_usec(&now, &st->last_collected_time);
890 + duration_since_last_update = dt_usec(&now, &st->last_collected_time);
891 #ifdef NETDATA_INTERNAL_CHECKS
892 if(!discard_reason) discard_reason = "NO USEC GIVEN BY COLLECTOR";
893 #endif
@@ -924,7 +911,7 @@ inline void rrdset_next_usec(RRDSET *st, usec_t microseconds) {
911 st->last_updated.tv_usec = now.tv_usec;
912 last_updated_time_align(st);
913
927 - microseconds = st->update_every * USEC_PER_SEC;
914 + duration_since_last_update = st->update_every * USEC_PER_SEC;
915 #ifdef NETDATA_INTERNAL_CHECKS
916 if(!discard_reason) discard_reason = "COLLECTION TIME IN FUTURE";
917 #endif
@@ -936,21 +923,21 @@ inline void rrdset_next_usec(RRDSET *st, usec_t microseconds) {
923 " secs in the past (counter #%zu, update #%zu). Adjusting it to current time.", rrdset_id(st), rrdhost_hostname(st->rrdhost), (NETDATA_DOUBLE)since_last_usec / USEC_PER_SEC, st->counter, st->counter_done);
924 #endif
925
939 - microseconds = (usec_t)since_last_usec;
926 + duration_since_last_update = (usec_t)since_last_usec;
927 #ifdef NETDATA_INTERNAL_CHECKS
928 if(!discard_reason) discard_reason = "COLLECTION TIME TOO FAR IN THE PAST";
929 #endif
930 }
931
932 #ifdef NETDATA_INTERNAL_CHECKS
946 - if(since_last_usec > 0 && (susec_t)microseconds < since_last_usec) {
933 + if(since_last_usec > 0 && (susec_t) duration_since_last_update < since_last_usec) {
934 static __thread susec_t min_delta = USEC_PER_SEC * 3600, permanent_min_delta = 0;
935 static __thread time_t last_t = 0;
936
937 // the first time initialize it so that it will make the check later
938 if(last_t == 0) last_t = now.tv_sec + 60;
939
953 - susec_t delta = since_last_usec - (susec_t)microseconds;
940 + susec_t delta = since_last_usec - (susec_t) duration_since_last_update;
941 if(delta < min_delta) min_delta = delta;
942
943 if(now.tv_sec >= last_t + 60) {
@@ -968,23 +955,39 @@ inline void rrdset_next_usec(RRDSET *st, usec_t microseconds) {
955 }
956
957 #ifdef NETDATA_INTERNAL_CHECKS
971 - debug(D_RRD_CALLS, "rrdset_next_usec() for chart %s with microseconds %llu", rrdset_name(st), microseconds);
972 - rrdset_debug(st, "NEXT: %llu microseconds", microseconds);
958 + debug(D_RRD_CALLS, "rrdset_timed_next() for chart %s with duration since last update %llu usec", rrdset_name(st), duration_since_last_update);
959 + rrdset_debug(st, "NEXT: %llu microseconds", duration_since_last_update);
960
974 - if(discarded && discarded != microseconds)
975 - info("host '%s', chart '%s': discarded data collection time of %llu usec, replaced with %llu usec, reason: '%s'", rrdhost_hostname(st->rrdhost), rrdset_id(st), discarded, microseconds, discard_reason?discard_reason:"UNDEFINED");
961 + if(discarded && discarded != duration_since_last_update)
962 + info("host '%s', chart '%s': discarded data collection time of %llu usec, replaced with %llu usec, reason: '%s'", rrdhost_hostname(st->rrdhost), rrdset_id(st), discarded, duration_since_last_update, discard_reason?discard_reason:"UNDEFINED");
963
964 #endif
965
979 - st->usec_since_last_update = microseconds;
966 + st->usec_since_last_update = duration_since_last_update;
967 }
968
969 +inline void rrdset_next_usec_unfiltered(RRDSET *st, usec_t duration_since_last_update) {
970 + if(unlikely(!st->last_collected_time.tv_sec || !duration_since_last_update || (rrdset_flag_check(st, RRDSET_FLAG_SYNC_CLOCK)))) {
971 + // call the full next_usec() function
972 + rrdset_next_usec(st, duration_since_last_update);
973 + return;
974 + }
975 +
976 + st->usec_since_last_update = duration_since_last_update;
977 +}
978 +
979 +inline void rrdset_next_usec(RRDSET *st, usec_t duration_since_last_update) {
980 + struct timeval now;
981 +
982 + now_realtime_timeval(&now);
983 + rrdset_timed_next(st, now, duration_since_last_update);
984 +}
985
986 // ----------------------------------------------------------------------------
987 // RRDSET - process the collected values for all dimensions of a chart
988
986 -static inline usec_t rrdset_init_last_collected_time(RRDSET *st) {
987 - now_realtime_timeval(&st->last_collected_time);
989 +static inline usec_t rrdset_init_last_collected_time(RRDSET *st, struct timeval now) {
990 + st->last_collected_time = now;
991 last_collected_time_align(st);
992
993 usec_t last_collect_ut = st->last_collected_time.tv_sec * USEC_PER_SEC + st->last_collected_time.tv_usec;
@@ -1092,8 +1095,7 @@ void store_metric_at_tier(RRDDIM *rd, struct rrddim_tier *t, STORAGE_POINT sp, u
1095 }
1096 }
1097
1095 -static void store_metric(RRDDIM *rd, usec_t point_end_time_ut, NETDATA_DOUBLE n, SN_FLAGS flags) {
1096 -
1098 +void rrddim_store_metric(RRDDIM *rd, usec_t point_end_time_ut, NETDATA_DOUBLE n, SN_FLAGS flags) {
1099 // store the metric on tier 0
1100 rd->tiers[0]->collect_ops.store_metric(rd->tiers[0]->db_collection_handle, point_end_time_ut, n, 0, 0, 1, 0, flags);
1101
@@ -1282,7 +1284,7 @@ static inline size_t rrdset_done_interpolate(
1284
1285 if(unlikely(!store_this_entry)) {
1286 (void) ml_is_anomalous(rd, 0, false);
1285 - store_metric(rd, next_store_ut, NAN, SN_FLAG_NONE);
1287 + rrddim_store_metric(rd, next_store_ut, NAN, SN_FLAG_NONE);
1288 continue;
1289 }
1290
@@ -1294,7 +1296,7 @@ static inline size_t rrdset_done_interpolate(
1296 dim_storage_flags &= ~((storage_number)SN_FLAG_NOT_ANOMALOUS);
1297 }
1298
1297 - store_metric(rd, next_store_ut, new_value, dim_storage_flags);
1299 + rrddim_store_metric(rd, next_store_ut, new_value, dim_storage_flags);
1300 rd->last_stored_value = new_value;
1301 }
1302 else {
@@ -1304,7 +1306,7 @@ static inline size_t rrdset_done_interpolate(
1306 rrdset_debug(st, "%s: STORE[%ld] = NON EXISTING ", rrddim_name(rd), current_entry);
1307 #endif
1308
1307 - store_metric(rd, next_store_ut, NAN, SN_FLAG_NONE);
1309 + rrddim_store_metric(rd, next_store_ut, NAN, SN_FLAG_NONE);
1310 rd->last_stored_value = NAN;
1311 }
1312
@@ -1369,6 +1371,13 @@ static inline void rrdset_done_fill_the_gap(RRDSET *st) {
1371 }
1372
1373 void rrdset_done(RRDSET *st) {
1374 + struct timeval now;
1375 +
1376 + now_realtime_timeval(&now);
1377 + rrdset_timed_done(st, now);
1378 +}
1379 +
1380 +void rrdset_timed_done(RRDSET *st, struct timeval now) {
1381 if(unlikely(netdata_exit)) return;
1382
1383 debug(D_RRD_CALLS, "rrdset_done() for chart %s", rrdset_name(st));
@@ -1412,7 +1421,7 @@ void rrdset_done(RRDSET *st) {
1421 if(unlikely(!st->last_collected_time.tv_sec)) {
1422 // it is the first entry
1423 // set the last_collected_time to now
1415 - last_collect_ut = rrdset_init_last_collected_time(st) - update_every_ut;
1424 + last_collect_ut = rrdset_init_last_collected_time(st, now) - update_every_ut;
1425
1426 // the first entry should not be stored
1427 store_this_entry = 0;