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 :|