qemu-e2k/qga
Marc-André Lureau 9e6bdef224 util: add qemu_write_pidfile()
There are variants of qemu_create_pidfile() in qemu-pr-helper and
qemu-ga. Let's have a common implementation in libqemuutil.

The code is initially based from pr-helper write_pidfile(), with
various improvements and suggestions from Daniel Berrangé:

  QEMU will leave the pidfile existing on disk when it exits which
  initially made me think it avoids the deletion race. The app
  managing QEMU, however, may well delete the pidfile after it has
  seen QEMU exit, and even if the app locks the pidfile before
  deleting it, there is still a race.

  eg consider the following sequence

        QEMU 1        libvirtd        QEMU 2

  1.    lock(pidfile)

  2.    exit()

  3.                 open(pidfile)

  4.                 lock(pidfile)

  5.                                  open(pidfile)

  6.                 unlink(pidfile)

  7.                 close(pidfile)

  8.                                  lock(pidfile)

  IOW, at step 8 the new QEMU has successfully acquired the lock, but
  the pidfile no longer exists on disk because it was deleted after
  the original QEMU exited.

  While we could just say no external app should ever delete the
  pidfile, I don't think that is satisfactory as people don't read
  docs, and admins don't like stale pidfiles being left around on
  disk.

  To make this robust, I think we might want to copy libvirt's
  approach to pidfile acquisition which runs in a loop and checks that
  the file on disk /after/ acquiring the lock matches the file that
  was locked. Then we could in fact safely let QEMU delete its own
  pidfiles on clean exit..

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Message-Id: <20180831145314.14736-2-marcandre.lureau@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2018-10-02 18:47:55 +02:00
..
installer qga-win: Fixing msi upgrade disallow in WiX file 2018-07-03 15:20:50 -05:00
vss-win32 qga-win: fix error-handling in getNameByStringSID() 2017-10-26 20:01:32 -05:00
channel-posix.c qga: use local path for local headers 2018-06-01 19:20:38 +03:00
channel-win32.c qga: use local path for local headers 2018-06-01 19:20:38 +03:00
channel.h qga: add systemd socket activation support 2017-03-06 00:54:18 -06:00
commands-posix.c qga: fix file descriptor leak 2018-07-16 15:05:58 -05:00
commands-win32.c qga-win: Handle fstrim for OSes lower than Win8 2018-07-23 18:45:21 -05:00
commands.c glib: bump min required glib library version to 2.40 2018-06-29 12:22:28 +01:00
guest-agent-command-state.c qga: use local path for local headers 2018-06-01 19:20:38 +03:00
guest-agent-core.h Include qmp-commands.h exactly where needed 2018-02-09 13:52:10 +01:00
main.c util: add qemu_write_pidfile() 2018-10-02 18:47:55 +02:00
Makefile.objs qapi: Move qapi-schema.json to qapi/, rename generated files 2018-03-02 13:45:57 -06:00
qapi-schema.json qga/schema: fix documentation for GuestOSInfo 2018-07-03 15:20:50 -05:00
service-win32.c qga: Remove unnecessary glib.h includes 2016-06-07 18:19:24 +03:00
service-win32.h Clean up header guards that don't match their file name 2016-07-12 16:19:16 +02:00
vss-win32.c qga: use local path for local headers 2018-06-01 19:20:38 +03:00
vss-win32.h qga-win: Fix a bug where qemu-ga service is stuck during stop operation 2017-04-26 23:56:47 -05:00