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