]> sourceware.org Git - lvm2.git/commitdiff
dmeventd: enhance time waiting loop
authorZdenek Kabelac <zkabelac@redhat.com>
Wed, 4 Mar 2020 14:56:09 +0000 (15:56 +0100)
committerZdenek Kabelac <zkabelac@redhat.com>
Thu, 5 Mar 2020 16:38:55 +0000 (17:38 +0100)
dmeventd is 'scanning' statuses in loop (most usually in 10sec
intervals) - and meanwhile it sleeps within:
pthread_cond_timedwait()

However this function call tends to wakeup sometimes a short amount of
time sooner - and our code still believe the 'right time' has not yet
arrived and basically for a moment 'busy-looped' on calling this
function - so for systems with 'clock_gettime()' present we obtain
time and we go 10ms to the future second - this avoids unneeded
repeated invocation of our time scheduling loop.

TODO: monitoring during 1 hour 'time-change'...

daemons/dmeventd/dmeventd.c

index 36a35ba04d88488427670ec5fc087008c6ed06fd..96e70919b0735f3d4feccea9620f2ba0530d4f99 100644 (file)
@@ -752,7 +752,7 @@ static void _exit_timeout(void *unused __attribute__((unused)))
 static void *_timeout_thread(void *unused __attribute__((unused)))
 {
        struct thread_status *thread;
-       struct timespec timeout;
+       struct timespec timeout, real_time;
        time_t curr_time;
        int ret;
 
@@ -763,7 +763,16 @@ static void *_timeout_thread(void *unused __attribute__((unused)))
        while (!dm_list_empty(&_timeout_registry)) {
                timeout.tv_sec = 0;
                timeout.tv_nsec = 0;
+#ifndef HAVE_REALTIME
                curr_time = time(NULL);
+#else
+               if (clock_gettime(CLOCK_REALTIME, &real_time)) {
+                       log_error("Failed to read clock_gettime().");
+                       break;
+               }
+               /* 10ms back to the future */
+               curr_time = real_time.tv_sec + ((real_time.tv_nsec > (1000000000 - 10000000)) ? 1 : 0);
+#endif
 
                dm_list_iterate_items_gen(thread, &_timeout_registry, timeout_list) {
                        if (thread->next_time <= curr_time) {
This page took 0.040246 seconds and 5 git commands to generate.