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>
---
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.
---
 lib/daemon-windows.c | 43 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 43 insertions(+)

diff --git a/lib/daemon-windows.c b/lib/daemon-windows.c
index 8cf0fea..4c4724b 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,13 @@
 
 VLOG_DEFINE_THIS_MODULE(daemon_windows);
 
+/* Constants for flock function */
+#define        LOCK_SH 0x0                         /* Shared lock. */
+#define        LOCK_UN 0x80000000                  /* Unlock. Custom value. */
+
+/* High-order 32 bits of byte range to lock */
+#define LOCK_MAX_SIZE 0xFFFF0000
+
 static bool service_create;          /* Was --service specified? */
 static bool service_started;         /* Have we dispatched service to start? */
 
@@ -414,6 +422,33 @@ unlink_pidfile(void)
     }
 }
 
+static int
+flock(FILE* fd, int operation)
+{
+    NTSTATUS status;
+    HANDLE hFile;
+    OVERLAPPED ov = {0};
+
+    hFile = (HANDLE)_get_osfhandle(fileno(filep_pidfile));
+    if (hFile == INVALID_HANDLE_VALUE) {
+        VLOG_FATAL("Invalid handle value");
+        return -1;
+    }
+
+    if (operation & LOCK_UN) {
+        if (UnlockFileEx(hFile, 0, 0, LOCK_MAX_SIZE, &ov) == FALSE) {
+            return -1;
+        }
+    } else {
+        if (LockFileEx(hFile, operation, 0, 0, LOCK_MAX_SIZE, &ov) == FALSE) {
+            VLOG_FATAL("LockFileEx failed, status = 0x%08x\n", status);
+            return -1;
+        }
+    }
+
+    return 0;
+}
+
 /* If a pidfile has been configured, creates it and stores the running
  * process's pid in it.  Ensures that the pidfile will be deleted when the
  * process exits. */
@@ -444,6 +479,14 @@ make_pidfile(void)
         VLOG_FATAL("Failed to write into the pidfile %s", pidfile);
     }
 
+    fflush(filep_pidfile);
+    error = flock(filep_pidfile, LOCK_SH);
+    if (error) {
+        /* Looks like we failed to acquire the lock. */
+        VLOG_FATAL("%s: fcntl(F_SETLK) failed (%s)", pidfile,
+                   ovs_strerror(error));
+    }
+
     /* 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

Reply via email to