• Marc-André Lureau's avatar
    util: add qemu_write_pidfile() · 9e6bdef2
    Marc-André Lureau authored
    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: 's avatarMarc-André Lureau <marcandre.lureau@redhat.com>
    Message-Id: <20180831145314.14736-2-marcandre.lureau@redhat.com>
    Signed-off-by: 's avatarPaolo Bonzini <pbonzini@redhat.com>
    9e6bdef2