Commit 9aacb199 authored by Iustin Pop's avatar Iustin Pop
Browse files

Reinstall instance: disallow offline secondaries



Currently, reinstallation of a DRBD instance with the secondary node offline does:

node1# gnt-instance reinstall -f instance1
Waiting for job 139053 for instance1...
Thu Nov 18 01:36:09 2010  - WARNING: Could not prepare block device disk/0 on node node3 (is_primary=False, pass=1): Node is marked offline
Thu Nov 18 01:36:09 2010  - WARNING: Could not shutdown block device disk/0 on node node3: Node is marked offline
Job 139053 for instance1 has failed: Failure: command execution error:
Disk consistency error

Since this fails anyway, let's check the secondary nodes, thus
preventing any modifications to the instance (e.g. OS type change):

node1# gnt-instance reinstall -f instance1
Waiting for job 139058 for instance1...
Job 139058 for instance1 has failed: Failure: prerequisites not met for this operation:
error type: wrong_state, error details:
Instance secondary node offline, cannot reinstall: node3

The patch needs modifications to the _CheckNodeOnline function, in order
to display meaningful messages ("Can't use offline node" would be very
confusing for an instance reinstall, since we didn't select a node
manually).
Signed-off-by: default avatarIustin Pop <iustin@google.com>
Reviewed-by: default avatarRené Nussbaumer <rn@google.com>
parent 89e8af70
...@@ -593,17 +593,19 @@ def _CheckGlobalHvParams(params): ...@@ -593,17 +593,19 @@ def _CheckGlobalHvParams(params):
raise errors.OpPrereqError(msg, errors.ECODE_INVAL) raise errors.OpPrereqError(msg, errors.ECODE_INVAL)
def _CheckNodeOnline(lu, node): def _CheckNodeOnline(lu, node, msg=None):
"""Ensure that a given node is online. """Ensure that a given node is online.
@param lu: the LU on behalf of which we make the check @param lu: the LU on behalf of which we make the check
@param node: the node to check @param node: the node to check
@param msg: if passed, should be a message to replace the default one
@raise errors.OpPrereqError: if the node is offline @raise errors.OpPrereqError: if the node is offline
""" """
if msg is None:
msg = "Can't use offline node"
if lu.cfg.GetNodeInfo(node).offline: if lu.cfg.GetNodeInfo(node).offline:
raise errors.OpPrereqError("Can't use offline node %s" % node, raise errors.OpPrereqError("%s: %s" % (msg, node), errors.ECODE_STATE)
errors.ECODE_STATE)
def _CheckNodeNotDrained(lu, node): def _CheckNodeNotDrained(lu, node):
...@@ -4994,7 +4996,11 @@ class LUReinstallInstance(LogicalUnit): ...@@ -4994,7 +4996,11 @@ class LUReinstallInstance(LogicalUnit):
instance = self.cfg.GetInstanceInfo(self.op.instance_name) instance = self.cfg.GetInstanceInfo(self.op.instance_name)
assert instance is not None, \ assert instance is not None, \
"Cannot retrieve locked instance %s" % self.op.instance_name "Cannot retrieve locked instance %s" % self.op.instance_name
_CheckNodeOnline(self, instance.primary_node) _CheckNodeOnline(self, instance.primary_node, "Instance primary node"
" offline, cannot reinstall")
for node in instance.secondary_nodes:
_CheckNodeOnline(self, node, "Instance secondary node offline,"
" cannot reinstall")
if instance.disk_template == constants.DT_DISKLESS: if instance.disk_template == constants.DT_DISKLESS:
raise errors.OpPrereqError("Instance '%s' has no disks" % raise errors.OpPrereqError("Instance '%s' has no disks" %
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment