From fc5bb0feca66a46e36c9a1710a177fc066592e5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Nussbaumer?= <rn@google.com> Date: Thu, 3 May 2012 11:08:38 +0200 Subject: [PATCH] Special case blockdev_create MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is due to the nature of bdev. We spread some logic into cmdlib and deal for example with it's children recursively. This makes it hard to annotate the disk parameters in a generic way as we don't always deal with the top most disk. But the disk parameters are depending on the top device not on the children. Signed-off-by: RenΓ© Nussbaumer <rn@google.com> Reviewed-by: Iustin Pop <iustin@google.com> --- lib/cmdlib.py | 58 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 17 deletions(-) diff --git a/lib/cmdlib.py b/lib/cmdlib.py index e368f5b2d..18d5ab25a 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -8574,8 +8574,20 @@ class TLMigrateInstance(Tasklet): return self._ExecMigration() -def _CreateBlockDev(lu, node, instance, device, force_create, - info, force_open): +def _CreateBlockDev(lu, node, instance, device, force_create, info, + force_open): + """Wrapper around L{_CreateBlockDevInner}. + + This method annotates the root device first. + + """ + (disk,) = _AnnotateDiskParams(instance, [device], lu.cfg) + return _CreateBlockDevInner(lu, node, instance, disk, force_create, info, + force_open) + + +def _CreateBlockDevInner(lu, node, instance, device, force_create, + info, force_open): """Create a tree of block devices on a given node. If this device type has to be created on secondaries, create it and @@ -8583,6 +8595,8 @@ def _CreateBlockDev(lu, node, instance, device, force_create, If not, just recurse to children keeping the same 'force' value. + @attention: The device has to be annotated already. + @param lu: the lu on whose behalf we execute @param node: the node on which to create the device @type instance: L{objects.Instance} @@ -8607,8 +8621,8 @@ def _CreateBlockDev(lu, node, instance, device, force_create, if device.children: for child in device.children: - _CreateBlockDev(lu, node, instance, child, force_create, - info, force_open) + _CreateBlockDevInner(lu, node, instance, child, force_create, + info, force_open) if not force_create: return @@ -10797,7 +10811,8 @@ class TLReplaceDisks(Tasklet): """ iv_names = {} - for idx, dev in enumerate(self.instance.disks): + disks = _AnnotateDiskParams(self.instance, self.instance.disks, self.cfg) + for idx, dev in enumerate(disks): if idx not in self.disks: continue @@ -10808,12 +10823,15 @@ class TLReplaceDisks(Tasklet): lv_names = [".disk%d_%s" % (idx, suffix) for suffix in ["data", "meta"]] names = _GenerateUniqueNames(self.lu, lv_names) - vg_data = dev.children[0].logical_id[0] + (data_disk, meta_disk) = dev.children + vg_data = data_disk.logical_id[0] lv_data = objects.Disk(dev_type=constants.LD_LV, size=dev.size, - logical_id=(vg_data, names[0]), params={}) - vg_meta = dev.children[1].logical_id[0] + logical_id=(vg_data, names[0]), + params=data_disk.params) + vg_meta = meta_disk.logical_id[0] lv_meta = objects.Disk(dev_type=constants.LD_LV, size=DRBD_META_SIZE, - logical_id=(vg_meta, names[1]), params={}) + logical_id=(vg_meta, names[1]), + params=meta_disk.params) new_lvs = [lv_data, lv_meta] old_lvs = [child.Copy() for child in dev.children] @@ -10821,8 +10839,8 @@ class TLReplaceDisks(Tasklet): # we pass force_create=True to force the LVM creation for new_lv in new_lvs: - _CreateBlockDev(self.lu, node_name, self.instance, new_lv, True, - _GetInstanceInfoText(self.instance), False) + _CreateBlockDevInner(self.lu, node_name, self.instance, new_lv, True, + _GetInstanceInfoText(self.instance), False) return iv_names @@ -11031,13 +11049,14 @@ class TLReplaceDisks(Tasklet): # Step: create new storage self.lu.LogStep(3, steps_total, "Allocate new storage") - for idx, dev in enumerate(self.instance.disks): + disks = _AnnotateDiskParams(self.instance, self.instance.disks, self.cfg) + for idx, dev in enumerate(disks): self.lu.LogInfo("Adding new local storage on %s for disk/%d" % (self.new_node, idx)) # we pass force_create=True to force LVM creation for new_lv in dev.children: - _CreateBlockDev(self.lu, self.new_node, self.instance, new_lv, True, - _GetInstanceInfoText(self.instance), False) + _CreateBlockDevInner(self.lu, self.new_node, self.instance, new_lv, + True, _GetInstanceInfoText(self.instance), False) # Step 4: dbrd minors and drbd setups changes # after this, we must manually remove the drbd minors on both the @@ -11076,8 +11095,11 @@ class TLReplaceDisks(Tasklet): children=dev.children, size=dev.size, params={}) + (anno_new_drbd,) = _AnnotateDiskParams(self.instance, [new_drbd], + self.cfg) try: - _CreateSingleBlockDev(self.lu, self.new_node, self.instance, new_drbd, + _CreateSingleBlockDev(self.lu, self.new_node, self.instance, + anno_new_drbd, _GetInstanceInfoText(self.instance), False) except errors.GenericError: self.cfg.ReleaseDRBDMinors(self.instance.name) @@ -12553,10 +12575,12 @@ class LUInstanceSetParams(LogicalUnit): instance.name, pnode, [snode], disk_info, None, None, 0, feedback_fn, self.diskparams) + anno_disks = rpc.AnnotateDiskParams(constants.DT_DRBD8, new_disks, + self.diskparams) info = _GetInstanceInfoText(instance) feedback_fn("Creating additional volumes...") # first, create the missing data and meta devices - for disk in new_disks: + for disk in anno_disks: # unfortunately this is... not too nice _CreateSingleBlockDev(self, pnode, instance, disk.children[1], info, True) @@ -12572,7 +12596,7 @@ class LUInstanceSetParams(LogicalUnit): feedback_fn("Initializing DRBD devices...") # all child devices are in place, we can now create the DRBD devices - for disk in new_disks: + for disk in anno_disks: for node in [pnode, snode]: f_create = node == pnode _CreateSingleBlockDev(self, node, instance, disk, info, f_create) -- GitLab