]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
virsh: Improve checking for connection when running commands
authorPeter Krempa <pkrempa@redhat.com>
Fri, 24 Aug 2012 10:39:53 +0000 (12:39 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Fri, 31 Aug 2012 14:22:22 +0000 (16:22 +0200)
Almost each virsh command uses the function vshConnectionUsability
before doing anything, to check if the connection is "alive".  Commands
that don't need an conection are already conveniently marked with
VSH_CMD_FLAG_NOCONNECT. We can automaticaly check for the connection
before calling any remote command so we don't forget to do so.

This patch also upgrades the connection check to use virConnectIsAlive
along with the current approach.

tools/virsh.c

index 04d1b52ce9b981121fc3bae01f121f640a06c3dc..f144616b294033d921317d635693580469327a65 100644 (file)
@@ -1481,13 +1481,19 @@ vshCommandRun(vshControl *ctl, const vshCmd *cmd)
             !(cmd->def->flags & VSH_CMD_FLAG_NOCONNECT))
             vshReconnect(ctl);
 
-        if (enable_timing)
-            GETTIMEOFDAY(&before);
+        if ((cmd->def->flags & VSH_CMD_FLAG_NOCONNECT) ||
+            vshConnectionUsability(ctl, ctl->conn)) {
+            if (enable_timing)
+                GETTIMEOFDAY(&before);
 
-        ret = cmd->def->handler(ctl, cmd);
+            ret = cmd->def->handler(ctl, cmd);
 
-        if (enable_timing)
-            GETTIMEOFDAY(&after);
+            if (enable_timing)
+                GETTIMEOFDAY(&after);
+        } else {
+            /* connection is not usable, return error */
+            ret = false;
+        }
 
         /* try to automatically catch disconnections */
         if (!ret &&
@@ -1948,13 +1954,17 @@ vshFindTypedParamByName(const char *name, virTypedParameterPtr list, int count)
 bool
 vshConnectionUsability(vshControl *ctl, virConnectPtr conn)
 {
-    /* TODO: use something like virConnectionState() to
-     *       check usability of the connection
-     */
-    if (!conn) {
+    if (!conn ||
+        virConnectIsAlive(conn) == 0) {
         vshError(ctl, "%s", _("no valid connection"));
         return false;
     }
+
+    /* The connection is considered dead only if
+     * virConnectIsAlive() successfuly says so.
+     */
+    vshResetLibvirtError();
+
     return true;
 }