Restore original alignment behaviour of RRDR (#6938)
* Restore original alignment behaviour of RRDR
Markos Fountoulakis committed
Sep 25, 2019 at 00:11 UTC
65727b6a30b742ad870a4d61c9fce04116eb9e20
1 file changed
+33
-54
web/api/queries/query.c
+33
-54
@@ -731,6 +731,7 @@ static void rrd2rrdr_log_request_response_metdata(RRDR *r
731
static int rrdr_convert_before_after_to_absolute(
732
long long *after_requestedp
733
, long long *before_requestedp
734
+ , int update_every
735
, time_t first_entry_t
736
, time_t last_entry_t
737
) {
@@ -749,6 +750,12 @@ static int rrdr_convert_before_after_to_absolute(
750
751
// allow relative for before (smaller than API_RELATIVE_TIME_MAX)
752
if(abs(before_requested) <= API_RELATIVE_TIME_MAX) {
753
+ if(abs(before_requested) % update_every) {
754
+ // make sure it is multiple of st->update_every
755
+ if(before_requested < 0) before_requested = before_requested - update_every -
756
+ before_requested % update_every;
757
+ else before_requested = before_requested + update_every - before_requested % update_every;
758
+ }
759
if(before_requested > 0) before_requested = first_entry_t + before_requested;
760
else before_requested = last_entry_t + before_requested; //last_entry_t is not really now_t
761
//TODO: fix before_requested to be relative to now_t
@@ -757,6 +764,12 @@ static int rrdr_convert_before_after_to_absolute(
764
765
// allow relative for after (smaller than API_RELATIVE_TIME_MAX)
766
if(abs(after_requested) <= API_RELATIVE_TIME_MAX) {
767
+ if(after_requested == 0) after_requested = -update_every;
768
+ if(abs(after_requested) % update_every) {
769
+ // make sure it is multiple of st->update_every
770
+ if(after_requested < 0) after_requested = after_requested - update_every - after_requested % update_every;
771
+ else after_requested = after_requested + update_every - after_requested % update_every;
772
+ }
773
after_requested = before_requested + after_requested;
774
absolute_period_requested = 0;
775
}
@@ -800,28 +813,6 @@ static RRDR *rrd2rrdr_fixedstep(
813
) {
814
int aligned = !(options & RRDR_OPTION_NOT_ALIGNED);
815
803
- if(!absolute_period_requested) {
804
- if(before_requested % update_every) {
805
- // make sure it is multiple of update_every
806
- if(before_requested > 0)
807
- before_requested = before_requested - update_every + before_requested % update_every;
808
- #ifdef NETDATA_INTERNAL_CHECKS
809
- else
810
- error("INTERNAL ERROR: rrd2rrdr() on %s, negative or zero before_requested", st->name);
811
- #endif
812
- }
813
- if(after_requested % update_every) {
814
- // make sure it is multiple of update_every
815
- if(after_requested < 0)
816
- after_requested = after_requested - update_every + after_requested % update_every;
817
- #ifdef NETDATA_INTERNAL_CHECKS
818
- else
819
- error("INTERNAL ERROR: rrd2rrdr() on %s, negative or zero after_requested", st->name);
820
- #endif
821
- }
822
- if(after_requested == before_requested) after_requested -= update_every;
823
- }
824
-
816
// the duration of the chart
817
time_t duration = before_requested - after_requested;
818
long available_points = duration / update_every;
@@ -1190,28 +1181,6 @@ static RRDR *rrd2rrdr_variablestep(
1181
) {
1182
int aligned = !(options & RRDR_OPTION_NOT_ALIGNED);
1183
1193
- if(!absolute_period_requested) {
1194
- if(before_requested % update_every) {
1195
- // make sure it is multiple of update_every
1196
- if(before_requested > 0)
1197
- before_requested = before_requested - before_requested % update_every;
1198
- #ifdef NETDATA_INTERNAL_CHECKS
1199
- else
1200
- error("INTERNAL ERROR: rrd2rrdr() on %s, negative or zero before_requested", st->name);
1201
- #endif
1202
- }
1203
- if(after_requested % update_every) {
1204
- // make sure it is multiple of update_every
1205
- if(after_requested < 0)
1206
- after_requested = after_requested - after_requested % update_every;
1207
- #ifdef NETDATA_INTERNAL_CHECKS
1208
- else
1209
- error("INTERNAL ERROR: rrd2rrdr() on %s, negative or zero after_requested", st->name);
1210
- #endif
1211
- }
1212
- if(after_requested == before_requested) after_requested -= update_every;
1213
- }
1214
-
1184
// the duration of the chart
1185
time_t duration = before_requested - after_requested;
1186
long available_points = duration / update_every;
@@ -1585,9 +1554,10 @@ RRDR *rrd2rrdr(
1554
time_t first_entry_t = rrdset_first_entry_t(st);
1555
time_t last_entry_t = rrdset_last_entry_t(st);
1556
1557
+ rrd_update_every = st->update_every;
1558
absolute_period_requested = rrdr_convert_before_after_to_absolute(&after_requested, &before_requested,
1589
- first_entry_t, last_entry_t);
1590
-
1559
+ rrd_update_every, first_entry_t,
1560
+ last_entry_t);
1561
#ifdef ENABLE_DBENGINE
1562
if ((st->rrd_memory_mode == RRD_MEMORY_MODE_DBENGINE)) {
1563
struct rrdeng_region_info *region_info_array;
@@ -1597,24 +1567,33 @@ RRDR *rrd2rrdr(
1567
regions = rrdeng_variable_step_boundaries(st, after_requested, before_requested,
1568
®ion_info_array, &max_interval);
1569
if (1 == regions) {
1600
- if (region_info_array)
1601
- rrd_update_every = region_info_array[0].update_every;
1602
- else
1603
- rrd_update_every = st->update_every;
1604
- if (region_info_array)
1605
- freez(region_info_array);
1570
+ if (region_info_array) {
1571
+ if (rrd_update_every != region_info_array[0].update_every) {
1572
+ rrd_update_every = region_info_array[0].update_every;
1573
+ /* recalculate query alignment */
1574
+ absolute_period_requested =
1575
+ rrdr_convert_before_after_to_absolute(&after_requested, &before_requested, rrd_update_every,
1576
+ first_entry_t, last_entry_t);
1577
+ }
1578
+ freez(region_info_array);
1579
+ }
1580
return rrd2rrdr_fixedstep(st, points_requested, after_requested, before_requested, group_method,
1581
resampling_time_requested, options, dimensions, rrd_update_every,
1582
first_entry_t, last_entry_t, absolute_period_requested);
1583
} else {
1610
- rrd_update_every = (uint16_t)max_interval;
1584
+ if (rrd_update_every != (uint16_t)max_interval) {
1585
+ rrd_update_every = (uint16_t) max_interval;
1586
+ /* recalculate query alignment */
1587
+ absolute_period_requested = rrdr_convert_before_after_to_absolute(&after_requested, &before_requested,
1588
+ rrd_update_every, first_entry_t,
1589
+ last_entry_t);
1590
+ }
1591
return rrd2rrdr_variablestep(st, points_requested, after_requested, before_requested, group_method,
1592
resampling_time_requested, options, dimensions, rrd_update_every,
1593
first_entry_t, last_entry_t, absolute_period_requested, region_info_array);
1594
}
1595
}
1596
#endif
1617
- rrd_update_every = st->update_every;
1597
return rrd2rrdr_fixedstep(st, points_requested, after_requested, before_requested, group_method,
1598
resampling_time_requested, options, dimensions,
1599
rrd_update_every, first_entry_t, last_entry_t, absolute_period_requested);