libvirt/src/locking
Frido Roose a58cb1ac40 Release only specific sanlock resource
This is a patch for bug 826704
All sanlock resources get released when hot-dettaching a disk from the domain
because virLockManagerSanlockRelease uses the wrong function parameters/flags.
With the patch only the resources that should be released are cleaned up.

Signed-off-by: Frido Roose <frido.roose@gmail.com>
2012-08-13 10:29:12 -06:00
..
domain_lock.c Desert the FSF address in copyright 2012-07-23 10:50:50 +08:00
domain_lock.h Desert the FSF address in copyright 2012-07-23 10:50:50 +08:00
libvirt_sanlock.aug sanlock: fix locking for readonly devices 2012-05-14 16:44:09 -06:00
lock_driver_nop.c Desert the FSF address in copyright 2012-07-23 10:50:50 +08:00
lock_driver_nop.h Desert the FSF address in copyright 2012-07-23 10:50:50 +08:00
lock_driver_sanlock.c Release only specific sanlock resource 2012-08-13 10:29:12 -06:00
lock_driver.h Desert the FSF address in copyright 2012-07-23 10:50:50 +08:00
lock_manager.c Desert the FSF address in copyright 2012-07-23 10:50:50 +08:00
lock_manager.h Desert the FSF address in copyright 2012-07-23 10:50:50 +08:00
README
sanlock.conf Add support for shared sanlock leases 2012-06-25 10:17:56 +01:00
test_libvirt_sanlock.aug.in Add support for shared sanlock leases 2012-06-25 10:17:56 +01:00

       Using the Lock Manager APIs
       ===========================

This file describes how to use the lock manager APIs.
All the guest lifecycle sequences here have higher
level wrappers provided by the 'domain_lock.h' API,
which simplify thue usage

At libvirtd startup:

  plugin = virLockManagerPluginLoad("sync-manager");


At libvirtd shtudown:

  virLockManagerPluginUnload(plugin)


At guest startup:

  manager = virLockManagerNew(plugin,
                              VIR_LOCK_MANAGER_OBJECT_DOMAIN,
                              0);

  virLockManagerSetParameter(manager, "id", id);
  virLockManagerSetParameter(manager, "uuid", uuid);
  virLockManagerSetParameter(manager, "name", name);

  foreach disk
    virLockManagerRegisterResource(manager,
                                   VIR_LOCK_MANAGER_RESOURCE_TYPE_DISK,
                                   disk.path,
                                   ..flags...);

  if (!virLockManagerAcquireObject(manager))
    abort..

  run QEMU


At guest shutdown:

  ...send QEMU 'quit' monitor command, and/or kill(qemupid)...

  if (!virLockManagerShutdown(manager))
     kill(supervisorpid); /* XXX or leave it running ??? */

  virLockManagerFree(manager);



At libvirtd restart with running guests:

  foreach still running guest
    manager = virLockManagerNew(driver,
                                VIR_LOCK_MANAGER_START_DOMAIN,
                                VIR_LOCK_MANAGER_NEW_ATTACH);
    virLockManagerSetParameter(manager, "id", id);
    virLockManagerSetParameter(manager, "uuid", uuid);
    virLockManagerSetParameter(manager, "name", name);

    if (!virLockManagerGetChild(manager, &qemupid))
      kill(supervisorpid); /* XXX or leave it running ??? */



With disk hotplug:

  if (virLockManagerAcquireResource(manager,
                                    VIR_LOCK_MANAGER_RESOURCE_TYPE_DISK,
                                    disk.path
                                    ..flags..))
     ...abort hotplug attempt ...

  ...hotplug the device...



With disk unhotplug:

    ...hotunplug the device...

  if (virLockManagerReleaseResource(manager,
                                    VIR_LOCK_MANAGER_RESOURCE_TYPE_DISK,
                                    disk.path
                                    ..flags..))
     ...log warning ...



During migration:

  1. On source host

       if (!virLockManagerPrepareMigrate(manager, hosturi))
           ..don't start migration..

  2. On dest host

      manager = virLockManagerNew(driver,
                                  VIR_LOCK_MANAGER_START_DOMAIN,
                                  VIR_LOCK_MANAGER_NEW_MIGRATE);
      virLockManagerSetParameter(manager, "id", id);
      virLockManagerSetParameter(manager, "uuid", uuid);
      virLockManagerSetParameter(manager, "name", name);

      foreach disk
        virLockManagerRegisterResource(manager,
                                       VIR_LOCK_MANAGER_RESOURCE_TYPE_DISK,
                                       disk.path,
                                       ..flags...);

      char **supervisorargv;
      int supervisorargc;

      supervisor = virLockManagerGetSupervisorPath(manager);
      virLockManagerGetSupervisorArgs(&argv, &argc);

      cmd = qemuBuildCommandLine(supervisor, supervisorargv, supervisorargv);

      supervisorpid = virCommandExec(cmd);

      if (!virLockManagerGetChild(manager, &qemupid))
        kill(supervisorpid); /* XXX or leave it running ??? */

  3. Initiate migration in QEMU on source and wait for completion

  4a. On failure

      4a1 On target

            virLockManagerCompleteMigrateIn(manager,
                                            VIR_LOCK_MANAGER_MIGRATE_CANCEL);
            virLockManagerShutdown(manager);
            virLockManagerFree(manager);

      4a2 On source

            virLockManagerCompleteMigrateIn(manager,
                                            VIR_LOCK_MANAGER_MIGRATE_CANCEL);

  4b. On succcess


      4b1 On target

            virLockManagerCompleteMigrateIn(manager, 0);

      42 On source

            virLockManagerCompleteMigrateIn(manager, 0);
            virLockManagerShutdown(manager);
            virLockManagerFree(manager);


Notes:

  - If a lock manager impl does just VM level leases, it can
    ignore all the resource paths at startup.

  - If a lock manager impl does not support migrate
    it can return an error from all migrate calls

  - If a lock manger impl does not support hotplug
    it can return an error from all resource acquire/release calls