Fix failover in case the source node is offline
authorDimitris Aragiorgis <dimara@arrikto.com>
Wed, 20 Jan 2016 16:37:14 +0000 (18:37 +0200)
committerHrvoje Ribicic <riba@google.com>
Thu, 21 Jan 2016 12:53:46 +0000 (13:53 +0100)
Commit ff74b60 closes instance disks on the source node before
doing a failover. In case the node is offline this is not possible.
This patch proceeds with the failover in case the source node
is offline or the --ingore-consistency flag is set. Reduce also
some config lookups for the node's name.

This fixes Issue #1162.

Signed-off-by: Dimitris Aragiorgis <dimara@arrikto.com>
Reviewed-by: Hrvoje Ribicic <riba@google.com>

lib/cmdlib/instance_migration.py

index ca64afb..b93b334 100644 (file)
@@ -539,27 +539,35 @@ class TLMigrateInstance(Tasklet):
     else:
       mode = "in shared mode"
 
+    node_name = self.cfg.GetNodeName(node_uuid)
+
     self.feedback_fn("* opening instance disks on node %s %s" %
-                     (self.cfg.GetNodeName(node_uuid), mode))
+                     (node_name, mode))
 
     disks = self.cfg.GetInstanceDisks(self.instance.uuid)
     result = self.rpc.call_blockdev_open(node_uuid, self.instance.name,
                                          (disks, self.instance), exclusive)
-    result.Raise("Cannot open disks on node %s" %
-                 self.cfg.GetNodeName(node_uuid))
+    result.Raise("Cannot open instance disks on node %s" % node_name)
 
   def _CloseInstanceDisks(self, node_uuid):
     """Close instance disks.
 
     """
-    self.feedback_fn("* closing instance disks on node %s" %
-                     self.cfg.GetNodeName(node_uuid))
+    node_name = self.cfg.GetNodeName(node_uuid)
+
+    self.feedback_fn("* closing instance disks on node %s" % node_name)
 
     disks = self.cfg.GetInstanceDisks(self.instance.uuid)
     result = self.rpc.call_blockdev_close(node_uuid, self.instance.name,
                                           (disks, self.instance))
-    result.Raise("Cannot close instance disks on node %s" %
-                 self.cfg.GetNodeName(node_uuid))
+    msg = result.fail_msg
+    if msg:
+      if result.offline or self.ignore_consistency:
+        self.lu.LogWarning("Could not close instance disks on node %s,"
+                           " proceeding anyway" % node_name)
+      else:
+        raise errors.OpExecError("Cannot close instance disks on node %s: %s" %
+                                 (node_name, msg))
 
   def _GoStandalone(self):
     """Disconnect from the network.