diff --git a/lib/bdev.py b/lib/bdev.py
index c3f4a7c46a4b9ceda9daa9d5599cc19c7a998a5c..4732992eff6c35104d00b75eda4713c64bd5d5bf 100644
--- a/lib/bdev.py
+++ b/lib/bdev.py
@@ -1243,7 +1243,7 @@ class DRBD8(BaseDRBD):
the attach if can return success.
"""
- for minor in self._GetUsedDevs():
+ for minor in (self._aminor,):
info = self._GetDevInfo(self._GetShowData(minor))
match_l = self._MatchesLocal(info)
match_r = self._MatchesNet(info)
@@ -1319,7 +1319,9 @@ class DRBD8(BaseDRBD):
if not result:
return result
- minor = self._FindUnusedMinor()
+ # TODO: maybe completely tear-down the minor (drbdsetup ... down)
+ # before attaching our own?
+ minor = self._aminor
need_localdev_teardown = False
if self._children and self._children[0] and self._children[1]:
result = self._AssembleLocal(minor, self._children[0].dev_path,
diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index 75936904bd698e53cc134d15567124d36d92a6ad..b65820804ae31a7edd7e7e7897b91d59938385be 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -2958,7 +2958,8 @@ def _GenerateDiskTemplate(cfg, template_name,
raise errors.ProgrammerError("Wrong template configuration")
remote_node = secondary_nodes[0]
(minor_pa, minor_pb,
- minor_sa, minor_sb) = [None, None, None, None]
+ minor_sa, minor_sb) = cfg.AllocateDRBDMinor(
+ [primary_node, primary_node, remote_node, remote_node], instance_name)
names = _GenerateUniqueNames(cfg, [".sda_data", ".sda_meta",
".sdb_data", ".sdb_meta"])
@@ -3517,6 +3518,7 @@ class LUCreateInstance(LogicalUnit):
feedback_fn("* creating instance disks...")
if not _CreateDisks(self.cfg, iobj):
_RemoveDisks(iobj, self.cfg)
+ self.cfg.ReleaseDRBDMinors(instance)
raise errors.OpExecError("Device creation failed, reverting...")
feedback_fn("adding instance %s to cluster config" % instance)
@@ -3525,6 +3527,8 @@ class LUCreateInstance(LogicalUnit):
# Declare that we don't want to remove the instance lock anymore, as we've
# added the instance to the config
del self.remove_locks[locking.LEVEL_INSTANCE]
+ # Remove the temp. assignements for the instance's drbds
+ self.cfg.ReleaseDRBDMinors(instance)
if self.op.wait_for_sync:
disk_abort = not _WaitForSync(self.cfg, iobj, self.proc)
@@ -4027,7 +4031,10 @@ class LUReplaceDisks(LogicalUnit):
# Step 4: dbrd minors and drbd setups changes
- minors = [None for dev in instance.disks]
+ # after this, we must manually remove the drbd minors on both the
+ # error and the success paths
+ minors = cfg.AllocateDRBDMinor([new_node for dev in instance.disks],
+ instance.name)
logging.debug("Allocated minors %s" % (minors,))
self.proc.LogStep(4, steps_total, "changing drbd configuration")
for dev, new_minor in zip(instance.disks, minors):
@@ -4041,12 +4048,15 @@ class LUReplaceDisks(LogicalUnit):
new_logical_id = (new_node, pri_node,
dev.logical_id[2], new_minor, dev.logical_id[4])
iv_names[dev.iv_name] = (dev, dev.children, new_logical_id)
+ logging.debug("Allocated new_minor: %s, new_logical_id: %s", new_minor,
+ new_logical_id)
new_drbd = objects.Disk(dev_type=constants.LD_DRBD8,
logical_id=new_logical_id,
children=dev.children)
if not _CreateBlockDevOnSecondary(cfg, new_node, instance,
new_drbd, False,
_GetInstanceInfoText(instance)):
+ self.cfg.ReleaseDRBDMinors(instance.name)
raise errors.OpExecError("Failed to create new DRBD on"
" node '%s'" % new_node)
@@ -4075,6 +4085,7 @@ class LUReplaceDisks(LogicalUnit):
if not done:
# no detaches succeeded (very unlikely)
+ self.cfg.ReleaseDRBDMinors(instance.name)
raise errors.OpExecError("Can't detach at least one DRBD from old node")
# if we managed to detach at least one, we update all the disks of
@@ -4084,6 +4095,9 @@ class LUReplaceDisks(LogicalUnit):
dev.logical_id = new_logical_id
cfg.SetDiskID(dev, pri_node)
cfg.Update(instance)
+ # we can remove now the temp minors as now the new values are
+ # written to the config file (and therefore stable)
+ self.cfg.ReleaseDRBDMinors(instance.name)
# and now perform the drbd attach
info("attaching primary drbds to new secondary (standalone => connected)")