Revision 7ea7bcf6 lib/cmdlib.py

b/lib/cmdlib.py
6332 6332
      self.op.remote_node = None
6333 6333
    if not hasattr(self.op, "iallocator"):
6334 6334
      self.op.iallocator = None
6335
    if not hasattr(self.op, "early_release"):
6336
      self.op.early_release = False
6335 6337

  
6336 6338
    TLReplaceDisks.CheckArguments(self.op.mode, self.op.remote_node,
6337 6339
                                  self.op.iallocator)
......
6363 6365

  
6364 6366
    self.replacer = TLReplaceDisks(self, self.op.instance_name, self.op.mode,
6365 6367
                                   self.op.iallocator, self.op.remote_node,
6366
                                   self.op.disks, False)
6368
                                   self.op.disks, False, self.op.early_release)
6367 6369

  
6368 6370
    self.tasklets = [self.replacer]
6369 6371

  
......
6410 6412
      self.op.remote_node = None
6411 6413
    if not hasattr(self.op, "iallocator"):
6412 6414
      self.op.iallocator = None
6415
    if not hasattr(self.op, "early_release"):
6416
      self.op.early_release = False
6413 6417

  
6414 6418
    TLReplaceDisks.CheckArguments(constants.REPLACE_DISK_CHG,
6415 6419
                                  self.op.remote_node,
......
6456 6460

  
6457 6461
      replacer = TLReplaceDisks(self, inst.name, constants.REPLACE_DISK_CHG,
6458 6462
                                self.op.iallocator, self.op.remote_node, [],
6459
                                True)
6463
                                True, self.op.early_release)
6460 6464
      tasklets.append(replacer)
6461 6465

  
6462 6466
    self.tasklets = tasklets
......
6498 6502

  
6499 6503
  """
6500 6504
  def __init__(self, lu, instance_name, mode, iallocator_name, remote_node,
6501
               disks, delay_iallocator):
6505
               disks, delay_iallocator, early_release):
6502 6506
    """Initializes this class.
6503 6507

  
6504 6508
    """
......
6511 6515
    self.remote_node = remote_node
6512 6516
    self.disks = disks
6513 6517
    self.delay_iallocator = delay_iallocator
6518
    self.early_release = early_release
6514 6519

  
6515 6520
    # Runtime data
6516 6521
    self.instance = None
......
6853 6858
          self.lu.LogWarning("Can't remove old LV: %s" % msg,
6854 6859
                             hint="remove unused LVs manually")
6855 6860

  
6861
  def _ReleaseNodeLock(self, node_name):
6862
    """Releases the lock for a given node."""
6863
    self.lu.context.glm.release(locking.LEVEL_NODE, node_name)
6864

  
6856 6865
  def _ExecDrbd8DiskOnly(self, feedback_fn):
6857 6866
    """Replace a disk on the primary or secondary for DRBD 8.
6858 6867

  
......
6963 6972

  
6964 6973
      self.cfg.Update(self.instance, feedback_fn)
6965 6974

  
6975
    cstep = 5
6976
    if self.early_release:
6977
      self.lu.LogStep(cstep, steps_total, "Removing old storage")
6978
      cstep += 1
6979
      self._RemoveOldStorage(self.target_node, iv_names)
6980
      # only release the lock if we're doing secondary replace, since
6981
      # we use the primary node later
6982
      if self.target_node != self.instance.primary_node:
6983
        self._ReleaseNodeLock(self.target_node)
6984

  
6966 6985
    # Wait for sync
6967 6986
    # This can fail as the old devices are degraded and _WaitForSync
6968 6987
    # does a combined result over all disks, so we don't check its return value
6969
    self.lu.LogStep(5, steps_total, "Sync devices")
6988
    self.lu.LogStep(cstep, steps_total, "Sync devices")
6989
    cstep += 1
6970 6990
    _WaitForSync(self.lu, self.instance)
6971 6991

  
6972 6992
    # Check all devices manually
6973 6993
    self._CheckDevices(self.instance.primary_node, iv_names)
6974 6994

  
6975 6995
    # Step: remove old storage
6976
    self.lu.LogStep(6, steps_total, "Removing old storage")
6977
    self._RemoveOldStorage(self.target_node, iv_names)
6996
    if not self.early_release:
6997
      self.lu.LogStep(cstep, steps_total, "Removing old storage")
6998
      cstep += 1
6999
      self._RemoveOldStorage(self.target_node, iv_names)
6978 7000

  
6979 7001
  def _ExecDrbd8Secondary(self, feedback_fn):
6980 7002
    """Replace the secondary node for DRBD 8.
......
7108 7130
                           to_node, msg,
7109 7131
                           hint=("please do a gnt-instance info to see the"
7110 7132
                                 " status of disks"))
7133
    cstep = 5
7134
    if self.early_release:
7135
      self.lu.LogStep(cstep, steps_total, "Removing old storage")
7136
      cstep += 1
7137
      self._RemoveOldStorage(self.target_node, iv_names)
7138
      self._ReleaseNodeLock([self.target_node, self.new_node])
7111 7139

  
7112 7140
    # Wait for sync
7113 7141
    # This can fail as the old devices are degraded and _WaitForSync
7114 7142
    # does a combined result over all disks, so we don't check its return value
7115
    self.lu.LogStep(5, steps_total, "Sync devices")
7143
    self.lu.LogStep(cstep, steps_total, "Sync devices")
7144
    cstep += 1
7116 7145
    _WaitForSync(self.lu, self.instance)
7117 7146

  
7118 7147
    # Check all devices manually
7119 7148
    self._CheckDevices(self.instance.primary_node, iv_names)
7120 7149

  
7121 7150
    # Step: remove old storage
7122
    self.lu.LogStep(6, steps_total, "Removing old storage")
7123
    self._RemoveOldStorage(self.target_node, iv_names)
7151
    if not self.early_release:
7152
      self.lu.LogStep(cstep, steps_total, "Removing old storage")
7153
      self._RemoveOldStorage(self.target_node, iv_names)
7124 7154

  
7125 7155

  
7126 7156
class LURepairNodeStorage(NoHooksLU):

Also available in: Unified diff