service.update_every = netdata.options.update_every;
// align the runs
- service.next_run = now - (now % (service.update_every * 1000));
+ service.next_run = now - (now % (service.update_every * 1000)) + (service.update_every * 1000);
service.commit = function() {
if(this.added !== true) {
this.added = true;
var now = new Date().getTime();
- while( this.next_run < now )
- this.next_run += (this.update_every * 1000);
+ this.next_run = now - (now % (service.update_every * 1000)) + (service.update_every * 1000);
netdata.services.push(this);
if(netdata.options.DEBUG === true) netdata.debug(this.module.name + ': ' + this.name + ': service committed.');
service.update();
now = new Date().getTime();
- while(service.next_run < now)
- service.next_run += (service.update_every * 1000);
+ service.next_run = now - (now % (service.update_every * 1000)) + (service.update_every * 1000);
}
// 1/10th of update_every in pause
self.debug("starting data collection - update frequency:", str(step), ", retries allowed:", str(self.retries))
while True: # run forever, unless something is wrong
now = float(time.time())
- next = self.timetable['next'] = now - (now % step) + step + (step / 3) # add 1/3 into the iteration to sync with netdata
+ next = self.timetable['next'] = now - (now % step) + step
# it is important to do this in a loop
# sleep() is interruptable
memset(rd->values, 0, rd->entries * sizeof(storage_number));
}
}
-static long align_entries_to_pagesize(long entries) {
+static inline long align_entries_to_pagesize(long entries) {
if(entries < 5) entries = 5;
if(entries > RRD_HISTORY_ENTRIES_MAX) entries = RRD_HISTORY_ENTRIES_MAX;
#endif
}
+static inline void timeval_align(struct timeval *tv, int update_every) {
+ tv->tv_sec -= tv->tv_sec % update_every;
+ tv->tv_usec = 500000;
+}
+
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)
{
if(!type || !type[0]) {
}
// make sure the database is aligned
- if(st->last_updated.tv_sec % update_every) {
- st->last_updated.tv_sec -= st->last_updated.tv_sec % update_every;
- st->last_updated.tv_usec = 0;
- }
+ if(st->last_updated.tv_sec)
+ timeval_align(&st->last_updated, update_every);
}
if(st) {
// it is the first entry
// set the last_collected_time to now
gettimeofday(&st->last_collected_time, NULL);
-
- // align it to update_every
- st->last_collected_time.tv_sec -= st->last_collected_time.tv_sec % st->update_every;
- st->last_collected_time.tv_usec = 0;
+ timeval_align(&st->last_collected_time, st->update_every);
last_collect_ut = st->last_collected_time.tv_sec * 1000000ULL + st->last_collected_time.tv_usec - update_every_ut;
st->usec_since_last_update = update_every_ut;
gettimeofday(&st->last_collected_time, NULL);
-
- // align it to update_every
- st->last_collected_time.tv_sec -= st->last_collected_time.tv_sec % st->update_every;
- st->last_collected_time.tv_usec = 0;
+ timeval_align(&st->last_collected_time, st->update_every);
unsigned long long ut = st->last_collected_time.tv_sec * 1000000ULL + st->last_collected_time.tv_usec - st->usec_since_last_update;
st->last_updated.tv_sec = (time_t) (ut / 1000000ULL);