@cryptotaxi247 / netdata-1 / commits / fc794f5e9

improved timing tolerance - move interpolation point to the middle of the iteration duration

Costa Tsaousis (ktsaou) committed Nov 15, 2016 at 00:28 UTC fc794f5e995ad3d402fea8d769dcac0cebd35e20
1 file changed +10 -16
src/rrd.c
+10 -16
@@ -438,7 +438,7 @@ void rrdset_reset(RRDSET *st)
438 memset(rd->values, 0, rd->entries * sizeof(storage_number));
439 }
440 }
441 -static long align_entries_to_pagesize(long entries) {
441 +static inline long align_entries_to_pagesize(long entries) {
442 if(entries < 5) entries = 5;
443 if(entries > RRD_HISTORY_ENTRIES_MAX) entries = RRD_HISTORY_ENTRIES_MAX;
444
@@ -460,6 +460,11 @@ static long align_entries_to_pagesize(long entries) {
460 #endif
461 }
462
463 +static inline void timeval_align(struct timeval *tv, int update_every) {
464 + tv->tv_sec = tv->tv_sec - tv->tv_sec % update_every + update_every / 2;
465 + tv->tv_usec = (unsigned long)(update_every % 2) * 500000;
466 +}
467 +
468 RRDSET *rrdset_create(const char *type, const char *id, const char *name, const char *family, const char *context, const char *title, const char *units, long priority, int update_every, int chart_type)
469 {
470 if(!type || !type[0]) {
@@ -527,13 +532,8 @@ RRDSET *rrdset_create(const char *type, const char *id, const char *name, const
532 }
533
534 // make sure the database is aligned
530 - if(st->last_updated.tv_sec) {
531 - if(st->last_updated.tv_sec % update_every)
532 - st->last_updated.tv_sec -= st->last_updated.tv_sec % update_every;
533 -
534 - // aligned in the middle, for tolerance with plugins
535 - st->last_updated.tv_usec = 500000ULL;
536 - }
535 + if(st->last_updated.tv_sec)
536 + timeval_align(&st->last_updated, update_every);
537 }
538
539 if(st) {
@@ -1103,10 +1103,7 @@ unsigned long long rrdset_done(RRDSET *st)
1103 // it is the first entry
1104 // set the last_collected_time to now
1105 gettimeofday(&st->last_collected_time, NULL);
1106 -
1107 - // align it to update_every
1108 - st->last_collected_time.tv_sec -= st->last_collected_time.tv_sec % st->update_every;
1109 - st->last_collected_time.tv_usec = 500000ULL;
1106 + timeval_align(&st->last_collected_time, st->update_every);
1107
1108 last_collect_ut = st->last_collected_time.tv_sec * 1000000ULL + st->last_collected_time.tv_usec - update_every_ut;
1109
@@ -1149,10 +1146,7 @@ unsigned long long rrdset_done(RRDSET *st)
1146 st->usec_since_last_update = update_every_ut;
1147
1148 gettimeofday(&st->last_collected_time, NULL);
1152 -
1153 - // align it to update_every
1154 - st->last_collected_time.tv_sec -= st->last_collected_time.tv_sec % st->update_every;
1155 - st->last_collected_time.tv_usec = 500000ULL;
1149 + timeval_align(&st->last_collected_time, st->update_every);
1150
1151 unsigned long long ut = st->last_collected_time.tv_sec * 1000000ULL + st->last_collected_time.tv_usec - st->usec_since_last_update;
1152 st->last_updated.tv_sec = (time_t) (ut / 1000000ULL);