bug-fix: fixed aligned queries that returned no data (#4472)
Costa Tsaousis committed
Oct 24, 2018 at 04:34 UTC
e5aca2581e137337f384dc5d48ae86593b808bd3
1 file changed
+22
-17
web/api/queries/query.c
+22
-17
@@ -334,7 +334,7 @@ static void rrd2rrdr_log_request_response_metdata(RRDR *r
334
// duration
335
, (size_t)(r->before - r->after + r->st->update_every)
336
, (size_t)(before_wanted - after_wanted + r->st->update_every)
337
- , (size_t)(before_requested - after_requested + r->st->update_every)
337
+ , (size_t)(before_requested - after_requested)
338
, (size_t)((rrdset_last_entry_t(r->st) - rrdset_first_entry_t(r->st)) + r->st->update_every)
339
340
// slot
@@ -468,22 +468,25 @@ RRDR *rrd2rrdr(
468
}
469
}
470
471
- size_t before_slot, after_slot;
471
+ // now that we have group,
472
+ // align the requested timeframe to fit it.
473
473
- time_t before_wanted = before_requested - (before_requested % ( ((aligned)?group:1) * st->update_every )) + ( ((aligned)?group:1) * st->update_every );
474
- if(unlikely(before_wanted > last_entry_t)) {
475
- before_wanted = last_entry_t - (last_entry_t % ((aligned) ? group : 1) * st->update_every);
474
+ if(aligned) {
475
+ // alignement has been requested, so align the values
476
+ before_requested -= (before_requested % group);
477
+ after_requested -= (after_requested % group);
478
+ }
479
477
- if(unlikely(before_wanted > last_entry_t)) {
478
- #ifdef NETDATA_INTERNAL_CHECKS
479
- error("INTERNAL ERROR: rrd2rrdr() on %s, before_wanted is after db max", st->name);
480
- #endif
480
+ // we align the request on requested_before
481
+ time_t before_wanted = before_requested;
482
+ if(likely(before_wanted > last_entry_t)) {
483
+ #ifdef NETDATA_INTERNAL_CHECKS
484
+ error("INTERNAL ERROR: rrd2rrdr() on %s, before_wanted is after db max", st->name);
485
+ #endif
486
482
- while(before_wanted > last_entry_t)
483
- before_wanted -= (((aligned) ? group : 1) * st->update_every);
484
- }
487
+ before_wanted = last_entry_t - (last_entry_t % ( ((aligned)?group:1) * st->update_every ));
488
}
486
- before_slot = rrdset_time2slot(st, before_wanted);
489
+ size_t before_slot = rrdset_time2slot(st, before_wanted);
490
491
// we need to estimate the number of points, for having
492
// an integer number of values per point
@@ -502,11 +505,10 @@ RRDR *rrd2rrdr(
505
error("INTERNAL ERROR: rrd2rrdr() on %s, after_wanted is before db min", st->name);
506
#endif
507
505
- while(after_wanted < first_entry_t)
506
- after_wanted += (((aligned) ? group : 1) * st->update_every);
508
+ after_wanted = first_entry_t - (first_entry_t % ( ((aligned)?group:1) * st->update_every )) + ( ((aligned)?group:1) * st->update_every );
509
}
510
}
509
- after_slot = rrdset_time2slot(st, after_wanted);
511
+ size_t after_slot = rrdset_time2slot(st, after_wanted);
512
513
// check if they are reversed
514
if(unlikely(after_wanted > before_wanted)) {
@@ -527,9 +529,9 @@ RRDR *rrd2rrdr(
529
points_wanted = 0;
530
}
531
532
+#ifdef NETDATA_INTERNAL_CHECKS
533
duration = before_wanted - after_wanted;
534
532
-#ifdef NETDATA_INTERNAL_CHECKS
535
if(after_wanted < first_entry_t)
536
error("INTERNAL CHECK: after_wanted %u is too small, minimum %u", (uint32_t)after_wanted, (uint32_t)first_entry_t);
537
@@ -718,6 +720,9 @@ RRDR *rrd2rrdr(
720
//if(aligned && (r->after % group) != 0)
721
// rrd2rrdr_log_request_response_metdata(r, group_method, aligned, group, group_time_requested, group_points, after_wanted, after_requested, before_wanted, before_requested, points_requested, points_wanted, after_slot, before_slot, "'after' is not aligned but alignment is required");
722
723
+ if(r->before != before_requested)
724
+ rrd2rrdr_log_request_response_metdata(r, group_method, aligned, group, group_time_requested, group_points, after_wanted, after_requested, before_wanted, before_requested, points_requested, points_wanted, after_slot, before_slot, "chart is not aligned to requested 'before'");
725
+
726
if(r->before != before_wanted)
727
rrd2rrdr_log_request_response_metdata(r, group_method, aligned, group, group_time_requested, group_points, after_wanted, after_requested, before_wanted, before_requested, points_requested, points_wanted, after_slot, before_slot, "got 'before' is not wanted 'before'");
728