@cryptotaxi247 / netdata-1 / commits / 9fd9823e0

journal: fix the 1 second latency in play mode (#16123)

provide a relative_to_absolute function that does not touch the current realtime time

Costa Tsaousis committed Oct 4, 2023 at 20:54 UTC 9fd9823e077869987e7d2b665fd46ac3e5a015ec
8 files changed +39 -23
collectors/systemd-journal.plugin/systemd-journal.c
+3 -4
@@ -2341,16 +2341,15 @@ static void function_systemd_journal(const char *transaction, char *function, in
2341 // ------------------------------------------------------------------------
2342 // validate parameters
2343
2344 - time_t expires = now_realtime_sec() + 1;
2345 - time_t now_s;
2344 + time_t now_s = now_realtime_sec();
2345 + time_t expires = now_s + 1;
2346
2347 if(!after_s && !before_s) {
2348 - now_s = now_realtime_sec();
2348 before_s = now_s;
2349 after_s = before_s - SYSTEMD_JOURNAL_DEFAULT_QUERY_DURATION;
2350 }
2351 else
2353 - rrdr_relative_window_to_absolute(&after_s, &before_s, &now_s, false);
2352 + rrdr_relative_window_to_absolute(&after_s, &before_s, now_s);
2353
2354 if(after_s > before_s) {
2355 time_t tmp = after_s;
database/contexts/api_v1.c
+2 -2
@@ -366,7 +366,7 @@ int rrdcontext_to_json(RRDHOST *host, BUFFER *wb, time_t after, time_t before, R
366 RRDCONTEXT *rc = rrdcontext_acquired_value(rca);
367
368 if(after != 0 && before != 0)
369 - rrdr_relative_window_to_absolute(&after, &before, NULL, false);
369 + rrdr_relative_window_to_absolute_query(&after, &before, NULL, false);
370
371 buffer_json_initialize(wb, "\"", "\"", 0, true, BUFFER_JSON_OPTIONS_DEFAULT);
372 struct rrdcontext_to_json t_contexts = {
@@ -403,7 +403,7 @@ int rrdcontexts_to_json(RRDHOST *host, BUFFER *wb, time_t after, time_t before,
403 uuid_unparse(*host->node_id, node_uuid);
404
405 if(after != 0 && before != 0)
406 - rrdr_relative_window_to_absolute(&after, &before, NULL, false);
406 + rrdr_relative_window_to_absolute_query(&after, &before, NULL, false);
407
408 buffer_json_initialize(wb, "\"", "\"", 0, true, BUFFER_JSON_OPTIONS_DEFAULT);
409 buffer_json_member_add_string(wb, "hostname", rrdhost_hostname(host));
database/contexts/api_v2.c
+3 -1
@@ -1940,7 +1940,9 @@ int rrdcontext_to_json_v2(BUFFER *wb, struct api_v2_contexts_request *req, CONTE
1940 }
1941
1942 if(req->after || req->before) {
1943 - ctl.window.relative = rrdr_relative_window_to_absolute(&ctl.window.after, &ctl.window.before, &ctl.now, false);
1943 + ctl.window.relative = rrdr_relative_window_to_absolute_query(&ctl.window.after, &ctl.window.before, &ctl.now
1944 + , false
1945 + );
1946 ctl.window.enabled = !(mode & CONTEXTS_V2_ALERT_TRANSITIONS);
1947 }
1948 else
database/contexts/query_target.c
+3 -2
@@ -1052,8 +1052,9 @@ QUERY_TARGET *query_target_create(QUERY_TARGET_REQUEST *qtr) {
1052 if(query_target_has_percentage_of_group(qt))
1053 qt->window.options &= ~RRDR_OPTION_PERCENTAGE;
1054
1055 - qt->internal.relative = rrdr_relative_window_to_absolute(&qt->window.after, &qt->window.before, &qt->window.now,
1056 - unittest_running);
1055 + qt->internal.relative = rrdr_relative_window_to_absolute_query(&qt->window.after, &qt->window.before
1056 + , &qt->window.now, unittest_running
1057 + );
1058
1059 // prepare our local variables - we need these across all these functions
1060 QUERY_TARGET_LOCALS qtl = {
libnetdata/libnetdata.c
+23 -10
@@ -1969,18 +1969,13 @@ int hash256_string(const unsigned char *string, size_t size, char *hash) {
1969 }
1970 #endif
1971
1972 -// Returns 1 if an absolute period was requested or 0 if it was a relative period
1973 -bool rrdr_relative_window_to_absolute(time_t *after, time_t *before, time_t *now_ptr, bool unittest_running) {
1974 - time_t now = now_realtime_sec() - 1;
1972
1976 - if(now_ptr)
1977 - *now_ptr = now;
1973 +bool rrdr_relative_window_to_absolute(time_t *after, time_t *before, time_t now) {
1974 + if(!now) now = now_realtime_sec();
1975
1976 int absolute_period_requested = -1;
1980 - long long after_requested, before_requested;
1981 -
1982 - before_requested = *before;
1983 - after_requested = *after;
1977 + time_t before_requested = *before;
1978 + time_t after_requested = *after;
1979
1980 // allow relative for before (smaller than API_RELATIVE_TIME_MAX)
1981 if(ABS(before_requested) <= API_RELATIVE_TIME_MAX) {
@@ -2025,11 +2020,29 @@ bool rrdr_relative_window_to_absolute(time_t *after, time_t *before, time_t *now
2020 // shift the query back to be in the present time
2021 // (this may also happen because of the rules above)
2022 if(before_requested > now) {
2028 - long long delta = before_requested - now;
2023 + time_t delta = before_requested - now;
2024 before_requested -= delta;
2025 after_requested -= delta;
2026 }
2027
2028 + *before = before_requested;
2029 + *after = after_requested;
2030 +
2031 + return (absolute_period_requested != 1);
2032 +}
2033 +
2034 +// Returns 1 if an absolute period was requested or 0 if it was a relative period
2035 +bool rrdr_relative_window_to_absolute_query(time_t *after, time_t *before, time_t *now_ptr, bool unittest_running) {
2036 + time_t now = now_realtime_sec() - 1;
2037 +
2038 + if(now_ptr)
2039 + *now_ptr = now;
2040 +
2041 + time_t before_requested = *before;
2042 + time_t after_requested = *after;
2043 +
2044 + int absolute_period_requested = rrdr_relative_window_to_absolute(&after_requested, &before_requested, now);
2045 +
2046 time_t absolute_minimum_time = now - (10 * 365 * 86400);
2047 time_t absolute_maximum_time = now + (1 * 365 * 86400);
2048
libnetdata/libnetdata.h
+2 -1
@@ -989,7 +989,8 @@ int hash256_string(const unsigned char *string, size_t size, char *hash);
989 extern bool unittest_running;
990 #define API_RELATIVE_TIME_MAX (3 * 365 * 86400)
991
992 -bool rrdr_relative_window_to_absolute(time_t *after, time_t *before, time_t *now_ptr, bool unittest_running);
992 +bool rrdr_relative_window_to_absolute(time_t *after, time_t *before, time_t now);
993 +bool rrdr_relative_window_to_absolute_query(time_t *after, time_t *before, time_t *now_ptr, bool unittest_running);
994
995 int netdata_base64_decode(const char *encoded, char *decoded, size_t decoded_size);
996
web/api/queries/query.c
+1 -1
@@ -2203,7 +2203,7 @@ bool query_target_calculate_window(QUERY_TARGET *qt) {
2203 }
2204
2205 // convert our before_wanted and after_wanted to absolute
2206 - rrdr_relative_window_to_absolute(&after_wanted, &before_wanted, NULL, unittest_running);
2206 + rrdr_relative_window_to_absolute_query(&after_wanted, &before_wanted, NULL, unittest_running);
2207 query_debug_log(":relative2absolute after %ld, before %ld", after_wanted, before_wanted);
2208
2209 if (natural_points && (options & RRDR_OPTION_SELECTED_TIER) && tier > 0 && storage_tiers > 1) {
web/api/queries/weights.c
+2 -2
@@ -1806,7 +1806,7 @@ int web_api_v12_weights(BUFFER *wb, QUERY_WEIGHTS_REQUEST *qwr) {
1806 }
1807 };
1808
1809 - if(!rrdr_relative_window_to_absolute(&qwr->after, &qwr->before, NULL, false))
1809 + if(!rrdr_relative_window_to_absolute_query(&qwr->after, &qwr->before, NULL, false))
1810 buffer_no_cacheable(wb);
1811 else
1812 buffer_cacheable(wb);
@@ -1823,7 +1823,7 @@ int web_api_v12_weights(BUFFER *wb, QUERY_WEIGHTS_REQUEST *qwr) {
1823 if(qwr->baseline_before <= API_RELATIVE_TIME_MAX)
1824 qwr->baseline_before += qwr->after;
1825
1826 - rrdr_relative_window_to_absolute(&qwr->baseline_after, &qwr->baseline_before, NULL, false);
1826 + rrdr_relative_window_to_absolute_query(&qwr->baseline_after, &qwr->baseline_before, NULL, false);
1827
1828 if (qwr->baseline_before <= qwr->baseline_after) {
1829 resp = HTTP_RESP_BAD_REQUEST;