On Tue, Apr 21, 2015 at 03:47:34PM -0600, Jim Fehlig wrote:
Daniel P. Berrange wrote:
> On Fri, Apr 17, 2015 at 03:36:22PM -0600, Jim Fehlig wrote:
>
>> Provide integration with libvirt's lock manager in the libxl driver.
>>
>> Signed-off-by: Jim Fehlig <jfehlig(a)suse.com>
>> ---
>> src/Makefile.am | 12 +++++++++
>> src/libxl/libvirtd_libxl.aug | 2 ++
>> src/libxl/libxl.conf | 10 ++++++++
>> src/libxl/libxl_conf.c | 14 +++++++++++
>> src/libxl/libxl_conf.h | 6 +++++
>> src/libxl/libxl_domain.c | 47 ++++++++++++++++++++++++++++++++++--
>> src/libxl/libxl_domain.h | 1 +
>> src/libxl/libxl_driver.c | 25 +++++++++++++++++++
>> src/libxl/libxl_migration.c | 6 +++++
>> src/libxl/test_libvirtd_libxl.aug.in | 1 +
>> 10 files changed, 122 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/Makefile.am b/src/Makefile.am
>> index 9a5f16c..1438174 100644
>> --- a/src/Makefile.am
>> +++ b/src/Makefile.am
>> @@ -2246,6 +2246,12 @@ BUILT_SOURCES += locking/qemu-lockd.conf
>> DISTCLEANFILES += locking/qemu-lockd.conf
>> endif WITH_QEMU
>>
>> +if WITH_LIBXL
>> +nodist_conf_DATA += locking/libxl-lockd.conf
>> +BUILT_SOURCES += locking/libxl-lockd.conf
>> +DISTCLEANFILES += locking/libxl-lockd.conf
>> +endif WITH_LIBXL
>> +
>> locking/%-lockd.conf: $(srcdir)/locking/lockd.conf
>> $(AM_V_GEN)$(MKDIR_P) locking ; \
>> cp $< $@
>> @@ -2431,6 +2437,12 @@ nodist_conf_DATA += locking/qemu-sanlock.conf
>> BUILT_SOURCES += locking/qemu-sanlock.conf
>> DISTCLEANFILES += locking/qemu-sanlock.conf
>> endif WITH_QEMU
>> +
>> +if WITH_LIBXL
>> +nodist_conf_DATA += locking/libxl-sanlock.conf
>> +BUILT_SOURCES += locking/libxl-sanlock.conf
>> +DISTCLEANFILES += locking/libxl-sanlock.conf
>> +endif WITH_LIBXL
>> else ! WITH_SANLOCK
>> EXTRA_DIST += $(LOCK_DRIVER_SANLOCK_SOURCES)
>> endif ! WITH_SANLOCK
>> diff --git a/src/libxl/libvirtd_libxl.aug b/src/libxl/libvirtd_libxl.aug
>> index f225954..d5aa150 100644
>> --- a/src/libxl/libvirtd_libxl.aug
>> +++ b/src/libxl/libvirtd_libxl.aug
>> @@ -25,9 +25,11 @@ module Libvirtd_libxl =
>>
>> (* Config entry grouped by function - same order as example config *)
>> let autoballoon_entry = bool_entry "autoballoon"
>> + let lock_entry = str_entry "lock_manager"
>>
>> (* Each entry in the config is one of the following ... *)
>> let entry = autoballoon_entry
>> + | lock_entry
>>
>> let comment = [ label "#comment" . del /#[ \t]*/ "# " .
store /([^ \t\n][^\n]*)?/ . del /\n/ "\n" ]
>> let empty = [ label "#empty" . eol ]
>> diff --git a/src/libxl/libxl.conf b/src/libxl/libxl.conf
>> index c104d40..ba3de7a 100644
>> --- a/src/libxl/libxl.conf
>> +++ b/src/libxl/libxl.conf
>> @@ -10,3 +10,13 @@
>> # autoballoon setting.
>> #
>> #autoballoon = 1
>> +
>> +
>> +# In order to prevent accidentally starting two domains that
>> +# share one writable disk, libvirt offers two approaches for
>> +# locking files: sanlock and virtlockd. sanlock is an external
>> +# project which libvirt integrates with via the libvirt-lock-sanlock
>> +# package. virtlockd is a libvirt implementation that is enabled with
>> +# "lockd". Accepted values are "sanlock" and
"lockd".
>> +#
>> +#lock_manager = "lockd"
>> diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
>> index 6ea2889..503e8a4 100644
>> --- a/src/libxl/libxl_conf.c
>> +++ b/src/libxl/libxl_conf.c
>> @@ -102,6 +102,7 @@ libxlDriverConfigDispose(void *obj)
>> VIR_FREE(cfg->libDir);
>> VIR_FREE(cfg->saveDir);
>> VIR_FREE(cfg->autoDumpDir);
>> + VIR_FREE(cfg->lockManagerName);
>> }
>>
>>
>> @@ -1495,6 +1496,7 @@ int libxlDriverConfigLoadFile(libxlDriverConfigPtr cfg,
>> const char *filename)
>> {
>> virConfPtr conf = NULL;
>> + virConfValuePtr p;
>> int ret = -1;
>>
>> /* Check the file is readable before opening it, otherwise
>> @@ -1512,6 +1514,18 @@ int libxlDriverConfigLoadFile(libxlDriverConfigPtr cfg,
>> if (libxlGetAutoballoonConf(cfg, conf) < 0)
>> goto cleanup;
>>
>> + if ((p = virConfGetValue(conf, "lock_manager"))) {
>> + if (p->type != VIR_CONF_STRING) {
>> + virReportError(VIR_ERR_INTERNAL_ERROR,
>> + "%s",
>> + _("Unexpected type for 'lock_manager'
setting"));
>> + goto cleanup;
>> + }
>> +
>> + if (VIR_STRDUP(cfg->lockManagerName, p->str) < 0)
>> + goto cleanup;
>> + }
>> +
>> ret = 0;
>>
>> cleanup:
>> diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h
>> index 5ba1a71..0a1c0db 100644
>> --- a/src/libxl/libxl_conf.h
>> +++ b/src/libxl/libxl_conf.h
>> @@ -38,6 +38,7 @@
>> # include "virobject.h"
>> # include "virchrdev.h"
>> # include "virhostdev.h"
>> +# include "locking/lock_manager.h"
>>
>> # define LIBXL_DRIVER_NAME "xenlight"
>> # define LIBXL_VNC_PORT_MIN 5900
>> @@ -98,6 +99,8 @@ struct _libxlDriverConfig {
>> * memory for new domains from domain0. */
>> bool autoballoon;
>>
>> + char *lockManagerName;
>> +
>> /* Once created, caps are immutable */
>> virCapsPtr caps;
>>
>> @@ -144,6 +147,9 @@ struct _libxlDriverPrivate {
>>
>> /* Immutable pointer, lockless APIs*/
>> virSysinfoDefPtr hostsysinfo;
>> +
>> + /* Immutable pointer. lockless access */
>> + virLockManagerPluginPtr lockManager;
>> };
>>
>> # define LIBXL_SAVE_MAGIC "libvirt-xml\n \0 \r"
>> diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
>> index 77d46d0..70247f5 100644
>> --- a/src/libxl/libxl_domain.c
>> +++ b/src/libxl/libxl_domain.c
>> @@ -34,6 +34,7 @@
>> #include "virlog.h"
>> #include "virstring.h"
>> #include "virtime.h"
>> +#include "locking/domain_lock.h"
>>
>> #define VIR_FROM_THIS VIR_FROM_LIBXL
>>
>> @@ -217,12 +218,36 @@ libxlDomainObjPrivateFree(void *data)
>> {
>> libxlDomainObjPrivatePtr priv = data;
>>
>> + VIR_FREE(priv->lockState);
>> virObjectUnref(priv);
>> }
>>
>> +static int
>> +libxlDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, void *data)
>> +{
>> + libxlDomainObjPrivatePtr priv = data;
>> +
>> + priv->lockState = virXPathString("string(./lockstate)",
ctxt);
>> +
>> + return 0;
>> +}
>> +
>> +static int
>> +libxlDomainObjPrivateXMLFormat(virBufferPtr buf, void *data)
>> +{
>> + libxlDomainObjPrivatePtr priv = data;
>> +
>> + if (priv->lockState)
>> + virBufferAsprintf(buf,
"<lockstate>%s</lockstate>\n", priv->lockState);
>> +
>> + return 0;
>> +}
>> +
>> virDomainXMLPrivateDataCallbacks libxlDomainXMLPrivateDataCallbacks = {
>> .alloc = libxlDomainObjPrivateAlloc,
>> .free = libxlDomainObjPrivateFree,
>> + .parse = libxlDomainObjPrivateXMLParse,
>> + .format = libxlDomainObjPrivateXMLFormat,
>> };
>>
>>
>> @@ -668,6 +693,11 @@ libxlDomainCleanup(libxlDriverPrivatePtr driver,
>> virHostdevReAttachDomainDevices(hostdev_mgr, LIBXL_DRIVER_NAME,
>> vm->def, VIR_HOSTDEV_SP_PCI, NULL);
>>
>> + VIR_FREE(priv->lockState);
>> + if (virDomainLockProcessPause(driver->lockManager, vm,
&priv->lockState) < 0)
>> + VIR_WARN("Unable to release lease on %s",
vm->def->name);
>> + VIR_DEBUG("Preserving lock state '%s'",
NULLSTR(priv->lockState));
>>
>
> I see a few calls to ProcessPause, but I'm not seeing any to ProcessResume,
> so I think you might have missed a few places needing hooks.
>
Currently I'm not using ProcessResume and instead calling ProcessStart
with paused param set to false. ProcessStart is called in
libxlDomainStart, which is called by all paths that start a domain, e.g.
start, create, restore, migrate, etc. I was under the impression that
ProcessResume is not needed if ProcessStart is called with paused=false.
For virtlockd it doesn't matter, but with the sanlock driver there is a
tiny difference due to VIR_LOCK_MANAGER_NEW_STARTED being passed to the
virLockManagerNew() method in the Start case.
Regards,
Daniel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|