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 <joao.m.martins(a)oracle.com>
---
Note: v4 series requires the patch
("remote: set VIR_TYPED_PARAM_STRING_OKAY on migration")
to make migration work again, but it's not reviewed yet.
[
https://www.redhat.com/archives/libvir-list/2016-February/msg00317.html]
---
src/libxl/libvirtd_libxl.aug | 4 ++++
src/libxl/libxl.conf | 18 ++++++++++++++++++
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, 59 insertions(+)
diff --git a/src/libxl/libvirtd_libxl.aug b/src/libxl/libvirtd_libxl.aug
index d5aa150..b31cc07 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 ba3de7a..82abdb6 100644
--- a/src/libxl/libxl.conf
+++ b/src/libxl/libxl.conf
@@ -20,3 +20,21 @@
# "lockd". Accepted values are "sanlock" and "lockd".
#
#lock_manager = "lockd"
+
+
+# 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 approximately after keepalive_interval *
+# (keepalive_count + 1) seconds since the last message received from
+# the daemon. If keepalive_interval is set to -1, 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 d7fb533..48b77d2 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 6ad9ad3..3c0eafb 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 5993abc..ab1f76e 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 baa8c79..63558e5 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" }
--
2.1.4