[libvirt] RFC [3/3]: Lock manager usage scenarios

Daniel P. Berrange berrange at redhat.com
Fri Sep 10 16:01:25 UTC 2010


At libvirtd startup:

  driver = virLockManagerPluginLoad("sync-manager");


At libvirtd shtudown:

  virLockManagerPluginUnload(driver)


At guest startup:

  manager = virLockManagerNew(driver,
                              VIR_LOCK_MANAGER_START_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...);

  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 ??? */


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

-- 
|: Red Hat, Engineering, London    -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :|
|: http://autobuild.org        -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list