On 25 July 2016 at 05:50, Paul Boca <pb...@cloudbasesolutions.com> wrote:
> If the PID file isn't locked then appctl.py detects it as stale and > bails out without doing anything. Because of this lots of Python tests > fail. > Also this protects the PID file from being overwritten. > > I used only shared lock, in order to be compatible with Python tests, > which try to acquire the lock exclusively. On Windows if the exclusive lock > is used, than the read access is denied too for other instances of this > file. > > Signed-off-by: Paul-Daniel Boca <pb...@cloudbasesolutions.com> > Acked-by: Alin Gabriel Serdean <aserd...@cloudbasesolutions.com> > Thank you, applied! > --- > V2: No changes > V3: No changes > V4: No changes > V5: Removed this patch from Python series. > Removed unused constants and defined 0xFFFF0000 as constant. > Updated commit text. > V6: flock returns now the error of GetLastError. > Also it uses fd parameter instead of the global filep_pidfile. > Removed unused local variable and unnecessary error message. > V7: Keep a shared lock on PID file after the fopen. > This ensures us that at most one process can write the same PID file. > fopen with 'w' on Windows creates a file with FILE_SHARED_WRITE > flag, so anyone with write access on file can write it. > V8: Added LOCKFILE_FAIL_IMMEDIATELY flag when trying to get exclusive lock > on PID file in order to avoid hangs of other daemons that try to > acquire > exclusive lock over the same PID file > V9: Small fatal error message update and on constants used. > Lock only the first byte in PID file, this is enough in our case. > --- > lib/daemon-windows.c | 41 +++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 41 insertions(+) > > diff --git a/lib/daemon-windows.c b/lib/daemon-windows.c > index 8cf0fea..d77724e 100644 > --- a/lib/daemon-windows.c > +++ b/lib/daemon-windows.c > @@ -18,6 +18,7 @@ > #include "daemon.h" > #include "daemon-private.h" > #include <stdio.h> > +#include <io.h> > #include <stdlib.h> > #include "dirs.h" > #include "ovs-thread.h" > @@ -26,6 +27,10 @@ > > VLOG_DEFINE_THIS_MODULE(daemon_windows); > > +/* Constants for flock function */ > +#define LOCK_SHARED 0x0 /* Shared lock. */ > +#define LOCK_UNLOCK 0x80000000 /* Unlock. Custom > value. */ > + > static bool service_create; /* Was --service specified? */ > static bool service_started; /* Have we dispatched service to > start? */ > > @@ -404,9 +409,39 @@ detach_process(int argc, char *argv[]) > } > > static void > +flock(FILE* fd, int operation) > +{ > + HANDLE hFile; > + OVERLAPPED ov = {0}; > + > + hFile = (HANDLE)_get_osfhandle(fileno(fd)); > + if (hFile == INVALID_HANDLE_VALUE) { > + VLOG_FATAL("Failed to get PID file handle (%s).", > + ovs_lasterror_to_string()); > + } > + > + if (operation & LOCK_UNLOCK) { > + if (UnlockFileEx(hFile, 0, 1, 0, &ov) == 0) { > + VLOG_FATAL("Failed to unlock PID file (%s).", > + ovs_lasterror_to_string()); > + } > + } else { > + /* Use LOCKFILE_FAIL_IMMEDIATELY flag to avoid hang of another > daemon that tries to > + acquire exclusive lock over the same PID file */ > + if (LockFileEx(hFile, operation | LOCKFILE_FAIL_IMMEDIATELY, > + 0, 1, 0, &ov) == FALSE) { > + VLOG_FATAL("Failed to lock PID file (%s).", > + ovs_lasterror_to_string()); > + } > + } > +} > + > +static void > unlink_pidfile(void) > { > if (filep_pidfile) { > + /* Remove the shared lock on file */ > + flock(filep_pidfile, LOCK_UNLOCK); > fclose(filep_pidfile); > } > if (pidfile) { > @@ -437,6 +472,8 @@ make_pidfile(void) > VLOG_FATAL("failed to open %s (%s)", pidfile, > ovs_strerror(errno)); > } > > + flock(filep_pidfile, LOCKFILE_EXCLUSIVE_LOCK); > + > fatal_signal_add_hook(unlink_pidfile, NULL, NULL, true); > > fprintf(filep_pidfile, "%d\n", _getpid()); > @@ -444,6 +481,10 @@ make_pidfile(void) > VLOG_FATAL("Failed to write into the pidfile %s", pidfile); > } > > + flock(filep_pidfile, LOCK_SHARED); > + /* This will remove the exclusive lock. The shared lock will remain */ > + flock(filep_pidfile, LOCK_UNLOCK); > + > /* Don't close the pidfile till the process exits. */ > } > > -- > 2.7.2.windows.1 > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev > _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev