mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-22 12:35:17 +00:00
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 <joao.m.martins@oracle.com>
This commit is contained in:
parent
a79da2457e
commit
5194eb9564
@ -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 ]
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
@ -105,6 +105,9 @@ struct _libxlDriverConfig {
|
||||
|
||||
char *lockManagerName;
|
||||
|
||||
int keepAliveInterval;
|
||||
unsigned int keepAliveCount;
|
||||
|
||||
/* Once created, caps are immutable */
|
||||
virCapsPtr caps;
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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" }
|
||||
|
Loading…
x
Reference in New Issue
Block a user