diff mbox

[v4,2/2] libxl: keepalive messages support

Message ID 1454705103-25456-2-git-send-email-joao.m.martins@oracle.com (mailing list archive)
State New, archived
Headers show

Commit Message

Joao Martins Feb. 5, 2016, 8:45 p.m. UTC
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>
---
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(+)

Comments

Jim Fehlig Feb. 10, 2016, 4:23 a.m. UTC | #1
On 02/05/2016 01:45 PM, Joao Martins wrote:
> 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>
> ---
> 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

Nit: I think the introductory sentence describing the purpose of the "keepalive
protocol" in qemu.conf is worth retaining. I added it to your existing comment
and pushed the series. Thanks for your patience! :-)

Regards,
Jim
diff mbox

Patch

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" }