From 5194eb956464b0a7f848e2e0769a0c2dbd3e18be Mon Sep 17 00:00:00 2001 From: Joao Martins Date: Fri, 5 Feb 2016 20:45:03 +0000 Subject: [PATCH] libxl: keepalive messages support This patch introduces keep alive messages support for P2P migration and it adds two new configuration entries namely 'keepalive_interval' 'keepalive_count' to control it. Behavior of these entries is the same as qemu driver thus the description is copied from there with just a few simplifications. Signed-off-by: Joao Martins --- src/libxl/libvirtd_libxl.aug | 4 ++++ src/libxl/libxl.conf | 21 +++++++++++++++++++++ src/libxl/libxl_conf.c | 26 ++++++++++++++++++++++++++ src/libxl/libxl_conf.h | 3 +++ src/libxl/libxl_migration.c | 6 ++++++ src/libxl/test_libvirtd_libxl.aug.in | 2 ++ 6 files changed, 62 insertions(+) diff --git a/src/libxl/libvirtd_libxl.aug b/src/libxl/libvirtd_libxl.aug index d5aa150d1a..b31cc078d0 100644 --- a/src/libxl/libvirtd_libxl.aug +++ b/src/libxl/libvirtd_libxl.aug @@ -26,10 +26,14 @@ 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" + let keepalive_interval_entry = int_entry "keepalive_interval" + let keepalive_count_entry = int_entry "keepalive_count" (* Each entry in the config is one of the following ... *) let entry = autoballoon_entry | lock_entry + | keepalive_interval_entry + | keepalive_count_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 ba3de7a28e..5c9bdaac26 100644 --- a/src/libxl/libxl.conf +++ b/src/libxl/libxl.conf @@ -20,3 +20,24 @@ # "lockd". Accepted values are "sanlock" and "lockd". # #lock_manager = "lockd" + + +# Keepalive protocol: +# This allows the libxl driver to detect broken connections to the +# remote libvirtd during peer-to-peer migration. A keepalive message +# is sent to the daemon after keepalive_interval seconds of inactivity +# to check if the daemon is still responding; keepalive_count is a +# maximum number of keepalive messages that are allowed to be sent to +# the deamon without getting any response before the connection is +# considered broken. In other words, the connection is automatically +# closed after approximately keepalive_interval * (keepalive_count + 1) +# seconds since the last message was received from the daemon. If +# keepalive_interval is set to -1, the libxl driver will not send +# keepalive requests during peer-to-peer migration; however, the remote +# libvirtd can still send them and source libvirtd will send responses. +# When keepalive_count is set to 0, connections will be automatically +# closed after keepalive_interval seconds of inactivity without sending +# any keepalive messages. +# +#keepalive_interval = 5 +#keepalive_count = 5 diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c index d7fb533902..48b77d25ae 100644 --- a/src/libxl/libxl_conf.c +++ b/src/libxl/libxl_conf.c @@ -1659,6 +1659,10 @@ int libxlDriverConfigLoadFile(libxlDriverConfigPtr cfg, virConfValuePtr p; int ret = -1; + /* defaults for keepalive messages */ + cfg->keepAliveInterval = 5; + cfg->keepAliveCount = 5; + /* Check the file is readable before opening it, otherwise * libvirt emits an error. */ @@ -1686,6 +1690,28 @@ int libxlDriverConfigLoadFile(libxlDriverConfigPtr cfg, goto cleanup; } + if ((p = virConfGetValue(conf, "keepalive_interval"))) { + if (p->type != VIR_CONF_LONG && p->type != VIR_CONF_ULONG) { + virReportError(VIR_ERR_INTERNAL_ERROR, + "%s", + _("Unexpected type for 'keepalive_interval' setting")); + goto cleanup; + } + + cfg->keepAliveInterval = p->l; + } + + if ((p = virConfGetValue(conf, "keepalive_count"))) { + if (p->type != VIR_CONF_ULONG) { + virReportError(VIR_ERR_INTERNAL_ERROR, + "%s", + _("Unexpected type for 'keepalive_count' setting")); + goto cleanup; + } + + cfg->keepAliveCount = p->l; + } + ret = 0; cleanup: diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h index 6ad9ad34c7..3c0eafb043 100644 --- a/src/libxl/libxl_conf.h +++ b/src/libxl/libxl_conf.h @@ -105,6 +105,9 @@ struct _libxlDriverConfig { char *lockManagerName; + int keepAliveInterval; + unsigned int keepAliveCount; + /* Once created, caps are immutable */ virCapsPtr caps; diff --git a/src/libxl/libxl_migration.c b/src/libxl/libxl_migration.c index 5993abcedd..ab1f76e32d 100644 --- a/src/libxl/libxl_migration.c +++ b/src/libxl/libxl_migration.c @@ -615,6 +615,7 @@ libxlDomainMigrationPerformP2P(libxlDriverPrivatePtr driver, bool useParams; virConnectPtr dconn = NULL; virErrorPtr orig_err = NULL; + libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); virObjectUnlock(vm); dconn = virConnectOpenAuth(dconnuri, &virConnectAuthConfig, 0); @@ -627,6 +628,10 @@ libxlDomainMigrationPerformP2P(libxlDriverPrivatePtr driver, return ret; } + if (virConnectSetKeepAlive(dconn, cfg->keepAliveInterval, + cfg->keepAliveCount) < 0) + goto cleanup; + virObjectUnlock(vm); useParams = VIR_DRV_SUPPORTS_FEATURE(dconn->driver, dconn, VIR_DRV_FEATURE_MIGRATION_PARAMS); @@ -645,6 +650,7 @@ libxlDomainMigrationPerformP2P(libxlDriverPrivatePtr driver, orig_err = virSaveLastError(); virObjectUnlock(vm); virObjectUnref(dconn); + virObjectUnref(cfg); virObjectLock(vm); if (orig_err) { virSetError(orig_err); diff --git a/src/libxl/test_libvirtd_libxl.aug.in b/src/libxl/test_libvirtd_libxl.aug.in index baa8c79b95..63558e508f 100644 --- a/src/libxl/test_libvirtd_libxl.aug.in +++ b/src/libxl/test_libvirtd_libxl.aug.in @@ -4,3 +4,5 @@ module Test_libvirtd_libxl = test Libvirtd_libxl.lns get conf = { "autoballoon" = "1" } { "lock_manager" = "lockd" } +{ "keepalive_interval" = "5" } +{ "keepalive_count" = "5" } -- GitLab