From 02a514ef712534b53ca315bf9c7b091229425076 Mon Sep 17 00:00:00 2001 From: Gurucharan Shetty Date: Wed, 28 May 2014 15:07:31 -0700 Subject: [PATCH] daemon-windows: unlink pidfile before stopping the service. When a OVS daemon is configured to run as a Windows service, when the service is stopped by calling service_stop(), the windows services manager does not give enough time to do everything in the atexit handler. So call the exit handler directly from service_stop(). Also add a test case for Windows services which checks for the termination of the service by looking at pidfile cleaned by the exit handler. Signed-off-by: Gurucharan Shetty --- lib/daemon-windows.c | 5 +++++ lib/fatal-signal.c | 7 +++---- lib/fatal-signal.h | 1 + tests/daemon.at | 25 +++++++++++++++++++++++++ 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/lib/daemon-windows.c b/lib/daemon-windows.c index f94ad9bd0..a7d65666a 100644 --- a/lib/daemon-windows.c +++ b/lib/daemon-windows.c @@ -218,6 +218,11 @@ should_service_stop(void) void service_stop() { + if (!service_started) { + return; + } + fatal_signal_atexit_handler(); + ResetEvent(wevent); CloseHandle(wevent); diff --git a/lib/fatal-signal.c b/lib/fatal-signal.c index 3ddff003c..ebafc9012 100644 --- a/lib/fatal-signal.c +++ b/lib/fatal-signal.c @@ -64,7 +64,6 @@ static volatile sig_atomic_t stored_sig_nr = SIG_ATOMIC_MAX; static struct ovs_mutex mutex; -static void atexit_handler(void); static void call_hooks(int sig_nr); #ifdef _WIN32 static BOOL WINAPI ConsoleHandlerRoutine(DWORD dwCtrlType); @@ -115,7 +114,7 @@ fatal_signal_init(void) } #endif } - atexit(atexit_handler); + atexit(fatal_signal_atexit_handler); } } @@ -226,8 +225,8 @@ fatal_ignore_sigpipe(void) #endif } -static void -atexit_handler(void) +void +fatal_signal_atexit_handler(void) { call_hooks(0); } diff --git a/lib/fatal-signal.h b/lib/fatal-signal.h index e50d14afc..c3626164c 100644 --- a/lib/fatal-signal.h +++ b/lib/fatal-signal.h @@ -31,6 +31,7 @@ void fatal_signal_fork(void); void fatal_signal_run(void); void fatal_signal_wait(void); void fatal_ignore_sigpipe(void); +void fatal_signal_atexit_handler(void); /* Convenience functions for unlinking files upon termination. * diff --git a/tests/daemon.at b/tests/daemon.at index e20abc266..4a6f341a6 100644 --- a/tests/daemon.at +++ b/tests/daemon.at @@ -159,3 +159,28 @@ AT_CHECK([grep 'ovsdb-server: could not initialize control socket' stderr], [0], [ignore], []) AT_CHECK([test ! -s pid]) AT_CLEANUP + +AT_SETUP([daemon --service]) +AT_SKIP_IF([test "$IS_WIN32" != "yes"]) +OVSDB_INIT([db]) +AT_CAPTURE_FILE([pid]) +# To create a Windows service, we need the absolute path for the executable. +abs_path="$(cd $(dirname `which ovsdb-server`); pwd -W; cd $OLDPWD)" + +AT_CHECK([sc create ovsdb-server binpath="$abs_path/ovsdb-server `pwd`/db --log-file=`pwd`/ovsdb-server.log --pidfile=`pwd`/pid --remote=punix:`pwd`/socket --unixctl=`pwd`/unixctl --service"], +[0], [[[SC]] CreateService SUCCESS +]) + +AT_CHECK([sc start ovsdb-server], [0], [ignore]) +OVS_WAIT_UNTIL([test -s pid]) +AT_CHECK([sc query ovsdb-server | grep STATE | grep RUNNING], [0], [ignore]) +AT_CHECK([kill -0 `cat pid`], [0], [ignore]) +AT_CHECK([ovs-appctl -t `pwd`/unixctl ovsdb-server/list-dbs], [0], +[Open_vSwitch +]) +AT_CHECK([sc stop ovsdb-server], [0], [ignore]) +OVS_WAIT_UNTIL([test ! -s pid]) +AT_CHECK([sc query ovsdb-server | grep STATE | grep STOPPED], [0], [ignore]) +AT_CHECK([sc delete ovsdb-server], [0], [[[SC]] DeleteService SUCCESS +]) +AT_CLEANUP -- 2.20.1