@cryptotaxi247 / netdata-1 / commits / 65727b6a3

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 &region_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);