Acked-by: Alin Gabriel Serdean <aserd...@cloudbasesolutions.com>

> -----Mesaj original-----
> De la: dev [mailto:dev-boun...@openvswitch.org] În numele Paul Boca
> Trimis: Wednesday, July 13, 2016 8:35 PM
> Către: dev@openvswitch.org
> Subiect: [ovs-dev] [PATCH V7] windows: Added lockf function and lock PID
> file
> 
> 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.
> 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.
> ---
>  lib/daemon-windows.c | 41
> +++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 41 insertions(+)
> 
> diff --git a/lib/daemon-windows.c b/lib/daemon-windows.c index
> 8cf0fea..e6e1452 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,14 @@
> 
>  VLOG_DEFINE_THIS_MODULE(daemon_windows);
> 
> +/* Constants for flock function */
> +#define      LOCK_SH 0x0                         /* Shared lock. */
> +#define      LOCK_EX LOCKFILE_EXCLUSIVE_LOCK     /* Exclusive
> 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? 
> */
> 
> @@ -404,9 +413,35 @@ 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("Invalid handle value");
> +    }
> +
> +    if (operation & LOCK_UN) {
> +        if (UnlockFileEx(hFile, 0, 0, LOCK_MAX_SIZE, &ov) == 0) {
> +            VLOG_FATAL("Failed to unlock PID file (%s).",
> +                       ovs_lasterror_to_string());
> +        }
> +    } else {
> +        if (LockFileEx(hFile, operation, 0, 0, LOCK_MAX_SIZE, &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_UN);
>          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, LOCK_EX);
> +
>      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_SH);
> +    /* This will remove the exclusive lock. The shared lock will remain */
> +    flock(filep_pidfile, LOCK_UN);
> +
>      /* 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

Reply via email to