[libvirt] [PATCH 03/20] virConnect(Un)RegisterCloseCallback: Throw an error in case the API is not supported

Marc Hartmayer mhartmay at linux.vnet.ibm.com
Thu Mar 8 12:20:26 UTC 2018


Report an error in case the driver does not support
connect(Un)registerCloseCallback. The commit 'close callback: move it
to driver' (88f09b75eb99) moved the responsibility for the close
callback to the driver. But if the driver doesn't support the
connectRegisterCloseCallback API this function does nothing, even no
unsupported error report. The only case where an error is reported is
when the API is supported but the call fails. The same behavior
applies to virConnectUnregisterCloseCallback.

This behavior is not intended as there are many use cases of this API
where the state of for example allocations depends on the result of
these functions.

To keep the behavior of virsh as before it must silently ignore
unsupported error for virConnectRegisterCloseCallback. For the remote
driver this change wouldn't be needed, but for the byhve driver, for
example. Otherwise the user would see the error message that virsh was
unable to register a disconnect callback.

Signed-off-by: Marc Hartmayer <mhartmay at linux.vnet.ibm.com>
Reviewed-by: Boris Fiuczynski <fiuczy at linux.vnet.ibm.com>
---
 src/libvirt-host.c | 24 ++++++++++++++----------
 tools/virsh.c      | 11 +++++++++--
 2 files changed, 23 insertions(+), 12 deletions(-)

diff --git a/src/libvirt-host.c b/src/libvirt-host.c
index 7ff7407a0874..bfa104b39918 100644
--- a/src/libvirt-host.c
+++ b/src/libvirt-host.c
@@ -1221,12 +1221,14 @@ virConnectRegisterCloseCallback(virConnectPtr conn,
     virCheckConnectReturn(conn, -1);
     virCheckNonNullArgGoto(cb, error);
 
-    if (conn->driver->connectRegisterCloseCallback &&
-        conn->driver->connectRegisterCloseCallback(conn, cb, opaque, freecb) < 0)
-        goto error;
-
-    return 0;
+    if (conn->driver->connectRegisterCloseCallback) {
+        int ret = conn->driver->connectRegisterCloseCallback(conn, cb, opaque, freecb);
+        if (ret < 0)
+            goto error;
+        return ret;
+    }
 
+    virReportUnsupportedError();
  error:
     virDispatchError(conn);
     return -1;
@@ -1256,12 +1258,14 @@ virConnectUnregisterCloseCallback(virConnectPtr conn,
     virCheckConnectReturn(conn, -1);
     virCheckNonNullArgGoto(cb, error);
 
-    if (conn->driver->connectUnregisterCloseCallback &&
-        conn->driver->connectUnregisterCloseCallback(conn, cb) < 0)
-        goto error;
-
-    return 0;
+    if (conn->driver->connectUnregisterCloseCallback) {
+        int ret = conn->driver->connectUnregisterCloseCallback(conn, cb);
+        if (ret < 0)
+            goto error;
+        return ret;
+    }
 
+    virReportUnsupportedError();
  error:
     virDispatchError(conn);
     return -1;
diff --git a/tools/virsh.c b/tools/virsh.c
index 5f8352e861d3..2df1197252b3 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -256,8 +256,15 @@ virshReconnect(vshControl *ctl, const char *name, bool readonly, bool force)
         priv->readonly = readonly;
 
         if (virConnectRegisterCloseCallback(priv->conn, virshCatchDisconnect,
-                                            ctl, NULL) < 0)
-            vshError(ctl, "%s", _("Unable to register disconnect callback"));
+                                            ctl, NULL) < 0) {
+            virErrorPtr error = virGetLastError();
+            if (error && error->code == VIR_ERR_NO_SUPPORT) {
+                /* silently ignore the unsupported error */
+                virResetLastError();
+            } else {
+                vshError(ctl, "%s", _("Unable to register disconnect callback"));
+            }
+        }
         if (connected && !force)
             vshError(ctl, "%s", _("Reconnected to the hypervisor"));
     }
-- 
2.13.4




More information about the libvir-list mailing list