From 565d040f43018c60e8b9c4c8f6194b4f5cee3ce1 Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Tue, 11 Dec 2012 16:39:50 +0000 Subject: [PATCH] Add support for locking based on LVM volume uuid --- src/locking/libvirt_lockd.aug | 1 + src/locking/lock_driver_lockd.c | 38 ++++++++++++++++++++++++++- src/locking/lockd.conf | 14 ++++++++++ src/locking/test_libvirt_lockd.aug.in | 1 + 4 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/locking/libvirt_lockd.aug b/src/locking/libvirt_lockd.aug index dafd8f9d0b..3473862796 100644 --- a/src/locking/libvirt_lockd.aug +++ b/src/locking/libvirt_lockd.aug @@ -20,6 +20,7 @@ module Libvirt_lockd = let entry = bool_entry "auto_disk_leases" | bool_entry "require_lease_for_disks" | str_entry "file_lockspace_dir" + | str_entry "lvm_lockspace_dir" let comment = [ label "#comment" . del /#[ \t]*/ "# " . store /([^ \t\n][^\n]*)?/ . del /\n/ "\n" ] let empty = [ label "#empty" . eol ] diff --git a/src/locking/lock_driver_lockd.c b/src/locking/lock_driver_lockd.c index aa0f94a464..e9f9071f8b 100644 --- a/src/locking/lock_driver_lockd.c +++ b/src/locking/lock_driver_lockd.c @@ -73,6 +73,7 @@ struct _virLockManagerLockDaemonDriver { bool requireLeaseForDisks; char *fileLockSpaceDir; + char *lvmLockSpaceDir; }; static virLockManagerLockDaemonDriverPtr driver = NULL; @@ -134,6 +135,17 @@ static int virLockManagerLockDaemonLoadConfig(const char *configFile) } } + p = virConfGetValue(conf, "lvm_lockspace_dir"); + CHECK_TYPE("lvm_lockspace_dir", VIR_CONF_STRING); + if (p && p->str) { + VIR_FREE(driver->lvmLockSpaceDir); + if (!(driver->lvmLockSpaceDir = strdup(p->str))) { + virReportOOMError(); + virConfFree(conf); + return -1; + } + } + p = virConfGetValue(conf, "require_lease_for_disks"); CHECK_TYPE("require_lease_for_disks", VIR_CONF_LONG); if (p) @@ -371,8 +383,11 @@ static int virLockManagerLockDaemonInit(unsigned int version, if (driver->fileLockSpaceDir && virLockManagerLockDaemonSetupLockspace(driver->fileLockSpaceDir) < 0) goto error; - } + if (driver->lvmLockSpaceDir && + virLockManagerLockDaemonSetupLockspace(driver->lvmLockSpaceDir) < 0) + goto error; + } return 0; @@ -546,6 +561,26 @@ static int virLockManagerLockDaemonAddResource(virLockManagerPtr lock, return 0; } + /* XXX we should somehow pass in TYPE=BLOCK info + * from the domain_lock code, instead of assuming /dev + */ + if (STRPREFIX(name, "/dev") && + driver->lvmLockSpaceDir) { + VIR_DEBUG("Trying to find an LVM UUID for %s", name); + if (virStorageFileGetLVMKey(name, &newName) < 0) + goto error; + + if (newName) { + VIR_DEBUG("Got an LVM UUID %s for %s", newName, name); + if (!(newLockspace = strdup(driver->lvmLockSpaceDir))) + goto no_memory; + autoCreate = true; + break; + } + virResetLastError(); + /* Fallback to generic non-block code */ + } + if (driver->fileLockSpaceDir) { if (!(newLockspace = strdup(driver->fileLockSpaceDir))) goto no_memory; @@ -623,6 +658,7 @@ static int virLockManagerLockDaemonAddResource(virLockManagerPtr lock, no_memory: virReportOOMError(); +error: VIR_FREE(newLockspace); VIR_FREE(newName); return -1; diff --git a/src/locking/lockd.conf b/src/locking/lockd.conf index 7545fd97ee..00f9b495e1 100644 --- a/src/locking/lockd.conf +++ b/src/locking/lockd.conf @@ -38,3 +38,17 @@ # storage. # #file_lockspace_dir = "/var/lib/libvirt/lockd/files" + + +# +# When using LVM volumes that can be visible across +# multiple, it is desirable to do locking based on +# the unique UUID associated with each volume, instead +# of their paths. Setting this path causes libvirt to +# do UUID based locking for LVM. +# +# Typically this directory would be located on a shared +# filesystem visible to all hosts accessing the same +# storage. +# +#lvm_lockspace_dir = "/var/lib/libvirt/lockd/lvmvolumes" diff --git a/src/locking/test_libvirt_lockd.aug.in b/src/locking/test_libvirt_lockd.aug.in index 2e65af6217..25cba68c07 100644 --- a/src/locking/test_libvirt_lockd.aug.in +++ b/src/locking/test_libvirt_lockd.aug.in @@ -5,3 +5,4 @@ module Test_libvirt_lockd = { "auto_disk_leases" = "0" } { "require_lease_for_disks" = "1" } { "file_lockspace_dir" = "/var/lib/libvirt/lockd/files" } +{ "lvm_lockspace_dir" = "/var/lib/libvirt/lockd/lvmvolumes" }