| Adjust the reaction to a polling interval timestamp that references |
| to a past time. |
| |
| Past timestamps can happen when ntpd adjusts router's time after network |
| connectivity is obtained after boot. Collectd shows warnings for each plugin |
| as it tries to enter new values with the same timestamp as the previous one. |
| |
| This patch adjusts the next polling time to be now+2 seconds for the main |
| loop and for the plugin-specific read loops. That avoids the warnings, but |
| does not overreact in case there are shorter polling intervals or the time |
| gets adjusted for other reasons. |
| |
| Additionally some debug statements are added, but they are visible only |
| when --enable-debug configure option is used in Makefile. |
| |
| |
| --- a/src/daemon/collectd.c |
| +++ b/src/daemon/collectd.c |
| @@ -274,20 +274,23 @@ static int do_loop(void) { |
| update_kstat(); |
| #endif |
| |
| + DEBUG("do_loop before plugin_read_all: now = %.3f", CDTIME_T_TO_DOUBLE(cdtime())); |
| /* Issue all plugins */ |
| plugin_read_all(); |
| |
| cdtime_t now = cdtime(); |
| + DEBUG("do_loop after plugin_read_all: now = %.3f, wait_until= %.3f", CDTIME_T_TO_DOUBLE(now), CDTIME_T_TO_DOUBLE(wait_until)); |
| if (now >= wait_until) { |
| - WARNING("Not sleeping because the next interval is " |
| + WARNING("Sleeping only 2s because the next interval is " |
| "%.3f seconds in the past!", |
| CDTIME_T_TO_DOUBLE(now - wait_until)); |
| - wait_until = now + interval; |
| - continue; |
| + wait_until = now + DOUBLE_TO_CDTIME_T(2); |
| + DEBUG("do_loop: wait_until adjusted to now+2 = %.3f", CDTIME_T_TO_DOUBLE(wait_until)); |
| } |
| |
| struct timespec ts_wait = CDTIME_T_TO_TIMESPEC(wait_until - now); |
| wait_until = wait_until + interval; |
| + DEBUG("do_loop ends: wait_until set to %.3f", CDTIME_T_TO_DOUBLE(wait_until)); |
| |
| while ((loop == 0) && (nanosleep(&ts_wait, &ts_wait) != 0)) { |
| if (errno != EINTR) { |
| --- a/src/daemon/plugin.c |
| +++ b/src/daemon/plugin.c |
| @@ -585,10 +585,11 @@ static void *plugin_read_thread(void __a |
| |
| /* Check, if `rf_next_read' is in the past. */ |
| if (rf->rf_next_read < now) { |
| - /* `rf_next_read' is in the past. Insert `now' |
| + /* `rf_next_read' is in the past. Insert `now'+2s |
| * so this value doesn't trail off into the |
| * past too much. */ |
| - rf->rf_next_read = now; |
| + rf->rf_next_read = now + DOUBLE_TO_CDTIME_T(2); |
| + DEBUG("plugin_read_thread: Next read is in the past. Adjusted to now+2s"); |
| } |
| |
| DEBUG("plugin_read_thread: Next read of the `%s' plugin at %.3f.", |