[ovs-dev] [PATCH 1/4] Make sure that time advances in a daemon between calls to time_refresh().

Ben Pfaff blp at nicira.com
Thu Oct 15 17:46:03 UTC 2009


OK, I made a static function with a more straightforward name and
had time_init() and time_postfork() both call that.

Pushed to citrix.

Justin Pettit <jpettit at nicira.com> writes:

> Great catch!  My only nit is that the function is called time_postfork
> (), but it is called in time_init(), which is definitely pre-fork.
> Kind of like high school.  :-(
>
> --Justin
>
>
> On Oct 14, 2009, at 4:54 PM, Ben Pfaff wrote:
>
>> Open vSwitch uses an interval timer signal to tell it that its
>> cached idea
>> of the current time has expired.  However, this didn't work in a
>> daemon
>> detached from the foreground session (invoked with --detach) because a
>> child created with fork() does not inherit the parent's interval
>> timer and
>> we did not re-set it after calling fork().
>>
>> This commit fixes the problem by setting the interval timer back up
>> after
>> calling fork() from daemonize().
>>
>> This fix is based on code inspection (which was then verified to be
>> correct
>> through testing).  It may not fix any actual problems in practice,
>> because
>> time_refresh() is called every time through the poll loop, and the
>> poll
>> loop typically runs more quickly than the periodic timer fires (1 ms
>> or so
>> average in ovs-vswitchd, vs. 100 ms timer interval).
>> ---
>> lib/daemon.c  |    2 ++
>> lib/timeval.c |   17 ++++++++++++++---
>> lib/timeval.h |    1 +
>> 3 files changed, 17 insertions(+), 3 deletions(-)
>>
>> diff --git a/lib/daemon.c b/lib/daemon.c
>> index 1e3f002..a35c639 100644
>> --- a/lib/daemon.c
>> +++ b/lib/daemon.c
>> @@ -23,6 +23,7 @@
>> #include <unistd.h>
>> #include "fatal-signal.h"
>> #include "dirs.h"
>> +#include "timeval.h"
>> #include "util.h"
>>
>> #define THIS_MODULE VLM_daemon
>> @@ -222,6 +223,7 @@ daemonize(void)
>>             if (chdir_) {
>>                 chdir("/");
>>             }
>> +            time_postfork();
>>             break;
>>
>>         case -1:
>> diff --git a/lib/timeval.c b/lib/timeval.c
>> index 3cca338..c62f519 100644
>> --- a/lib/timeval.c
>> +++ b/lib/timeval.c
>> @@ -57,8 +57,6 @@ void
>> time_init(void)
>> {
>>     struct sigaction sa;
>> -    struct itimerval itimer;
>> -
>>     if (inited) {
>>         return;
>>     }
>> @@ -78,7 +76,20 @@ time_init(void)
>>         ovs_fatal(errno, "sigaction(SIGALRM) failed");
>>     }
>>
>> -    /* Set up periodic timer. */
>> +    /* Set up periodic signal. */
>> +    time_postfork();
>> +}
>> +
>> +/* Set up the interval timer, to ensure that time advances even
>> without calling
>> + * time_refresh().
>> + *
>> + * A child created with fork() does not inherit the parent's
>> interval timer, so
>> + * this function needs to be called from the child after fork(). */
>> +void
>> +time_postfork(void)
>> +{
>> +    struct itimerval itimer;
>> +
>>     itimer.it_interval.tv_sec = 0;
>>     itimer.it_interval.tv_usec = TIME_UPDATE_INTERVAL * 1000;
>>     itimer.it_value = itimer.it_interval;
>> diff --git a/lib/timeval.h b/lib/timeval.h
>> index 660a207..8567d75 100644
>> --- a/lib/timeval.h
>> +++ b/lib/timeval.h
>> @@ -41,6 +41,7 @@ BUILD_ASSERT_DECL(TYPE_IS_SIGNED(time_t));
>> #define TIME_UPDATE_INTERVAL 100
>>
>> void time_init(void);
>> +void time_postfork(void);
>> void time_refresh(void);
>> time_t time_now(void);
>> long long int time_msec(void);
>> --
>> 1.6.3.3
>>
>>
>> _______________________________________________
>> dev mailing list
>> dev at openvswitch.org
>> http://openvswitch.org/mailman/listinfo/dev_openvswitch.org




More information about the dev mailing list