(* 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 ]
# "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
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.
*/
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:
char *lockManagerName;
+ int keepAliveInterval;
+ unsigned int keepAliveCount;
+
/* Once created, caps are immutable */
virCapsPtr caps;
bool useParams;
virConnectPtr dconn = NULL;
virErrorPtr orig_err = NULL;
+ libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
virObjectUnlock(vm);
dconn = virConnectOpenAuth(dconnuri, &virConnectAuthConfig, 0);
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);
orig_err = virSaveLastError();
virObjectUnlock(vm);
virObjectUnref(dconn);
+ virObjectUnref(cfg);
virObjectLock(vm);
if (orig_err) {
virSetError(orig_err);
test Libvirtd_libxl.lns get conf =
{ "autoballoon" = "1" }
{ "lock_manager" = "lockd" }
+{ "keepalive_interval" = "5" }
+{ "keepalive_count" = "5" }