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;