[libvirt] [PATCH 3/3] virsh: Notify users about disconnects

Jiri Denemark jdenemar at redhat.com
Thu Sep 17 12:23:13 UTC 2015


After my "client rpc: Report proper error for keepalive disconnections"
patch, virsh would no long print a warning when it closes a connection
to a daemon after a keepalive timeout. Although the warning

    virsh # 2015-09-15 10:59:26.729+0000: 642080: info :
    libvirt version: 1.2.19
    2015-09-15 10:59:26.729+0000: 642080: warning :
    virKeepAliveTimerInternal:143 : No response from client
    0x7efdc0a46730 after 1 keepalive messages in 2 seconds

was pretty ugly, it was still useful. This patch brings the useful part
back while making it much nicer:

virsh # error: Disconnected from qemu:///system due to keepalive timeout

Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
---
 tools/virsh.c | 35 ++++++++++++++++++++++++++++++++---
 1 file changed, 32 insertions(+), 3 deletions(-)

diff --git a/tools/virsh.c b/tools/virsh.c
index bb12dec..23436ea 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -95,12 +95,41 @@ static int disconnected; /* we may have been disconnected */
  * handler, just save the fact it was raised.
  */
 static void
-virshCatchDisconnect(virConnectPtr conn ATTRIBUTE_UNUSED,
+virshCatchDisconnect(virConnectPtr conn,
                      int reason,
-                     void *opaque ATTRIBUTE_UNUSED)
+                     void *opaque)
 {
-    if (reason != VIR_CONNECT_CLOSE_REASON_CLIENT)
+    if (reason != VIR_CONNECT_CLOSE_REASON_CLIENT) {
+        vshControl *ctl = opaque;
+        const char *str = "unknown reason";
+        virErrorPtr error;
+        char *uri;
+
+        error = virSaveLastError();
+        uri = virConnectGetURI(conn);
+
+        switch ((virConnectCloseReason) reason) {
+        case VIR_CONNECT_CLOSE_REASON_ERROR:
+            str = N_("Disconnected from %s due to I/O error");
+            break;
+        case VIR_CONNECT_CLOSE_REASON_EOF:
+            str = N_("Disconnected from %s due to end of file");
+            break;
+        case VIR_CONNECT_CLOSE_REASON_KEEPALIVE:
+            str = N_("Disconnected from %s due to keepalive timeout");
+            break;
+        case VIR_CONNECT_CLOSE_REASON_CLIENT:
+        case VIR_CONNECT_CLOSE_REASON_LAST:
+            break;
+        }
+        vshError(ctl, _(str), NULLSTR(uri));
+
+        if (error) {
+            virSetError(error);
+            virFreeError(error);
+        }
         disconnected++;
+    }
 }
 
 /* Main Function which should be used for connecting.
-- 
2.5.2




More information about the libvir-list mailing list