return rrddim_set_by_pointer(st, rd, value);
}
-void rrdset_next_usec(RRDSET *st, unsigned long long microseconds)
+void rrdset_next_usec_unfiltered(RRDSET *st, unsigned long long microseconds)
{
- if(!microseconds) rrdset_next(st);
- else {
- debug(D_RRD_CALLS, "rrdset_next_usec() for chart %s with microseconds %llu", st->name, microseconds);
-
- if(unlikely(st->debug)) debug(D_RRD_STATS, "%s: NEXT: %llu microseconds", st->name, microseconds);
- st->usec_since_last_update = microseconds;
+ if(unlikely(!st->last_collected_time.tv_sec || !microseconds)) {
+ // the first entry
+ microseconds = st->update_every * 1000000ULL;
}
+ st->usec_since_last_update = microseconds;
}
-void rrdset_next(RRDSET *st)
+void rrdset_next_usec(RRDSET *st, unsigned long long microseconds)
{
- unsigned long long microseconds = 0;
+ struct timeval now;
+ gettimeofday(&now, NULL);
- if(likely(st->last_collected_time.tv_sec)) {
- struct timeval now;
- gettimeofday(&now, NULL);
+ if(unlikely(!st->last_collected_time.tv_sec)) {
+ // the first entry
+ microseconds = st->update_every * 1000000ULL;
+ }
+ else if(unlikely(!microseconds)) {
+ // no dt given by the plugin
microseconds = usec_dt(&now, &st->last_collected_time);
}
- // prevent infinite loop
- else microseconds = st->update_every * 1000000ULL;
+ else {
+ // microseconds has the time since the last collection
+ unsigned long long now_usec = timeval_usec(&now);
+ unsigned long long last_usec = timeval_usec(&st->last_collected_time);
+ unsigned long long since_last_usec = usec_dt(&now, &st->last_collected_time);
- rrdset_next_usec(st, microseconds);
-}
+ // verify the microseconds given is good
+ if(unlikely(last_usec + microseconds > now_usec)) {
+ debug(D_RRD_CALLS, "rrdset_next_usec() for chart %s with dt %llu is %llu usec to the future", st->name, microseconds, last_usec + microseconds - now_usec);
-void rrdset_next_plugins(RRDSET *st)
-{
- rrdset_next(st);
+ if(unlikely(last_usec + microseconds > now_usec + 10000))
+ error("Invalid dt %llu usec given - it leads %llu usec to the future, for chart '%s' (%s).", microseconds, last_usec + microseconds - now_usec, st->name, st->id);
+
+ microseconds = since_last_usec;
+ }
+ else if(unlikely(microseconds < since_last_usec * 0.2 || microseconds > since_last_usec * 1.2)) {
+ error("Invalid dt %llu usec given - expected %llu usec +/- 20%%, for chart '%s' (%s).", microseconds, since_last_usec, st->name, st->id);
+ microseconds = since_last_usec;
+ }
+ }
+ debug(D_RRD_CALLS, "rrdset_next_usec() for chart %s with microseconds %llu", st->name, microseconds);
+
+ if(unlikely(st->debug)) debug(D_RRD_STATS, "%s: NEXT: %llu microseconds", st->name, microseconds);
+ st->usec_since_last_update = microseconds;
}
unsigned long long rrdset_done(RRDSET *st)