From: Iustin Pop Date: Fri, 28 Jan 2011 15:53:40 +0000 (+0100) Subject: Re-create instance disk symlinks on activate X-Git-Tag: v2.4.0rc1~20 X-Git-Url: https://code.grnet.gr/git/ganeti-local/commitdiff_plain/c417e1152c3b9ff59ea2091df6b30d1b75371c36 Re-create instance disk symlinks on activate This patch implements recreation of instance disk symlinks when the activate-disks operation is run. Until now, it was not possible to re-create these symlinks without stopping and starting or migrating an instance as the RPC call where this is done was in instance startup and migration. In order to do this, the blockdev_assemble rpc call needs the disk index too, which is added to the protocol. This is a change from 2.3 and makes instance startup incompatible (FYI). Signed-off-by: Iustin Pop Reviewed-by: Michael Hanselmann --- diff --git a/lib/backend.py b/lib/backend.py index 2bae5a2..0c311ed 100644 --- a/lib/backend.py +++ b/lib/backend.py @@ -1492,7 +1492,7 @@ def _RecursiveAssembleBD(disk, owner, as_primary): return result -def BlockdevAssemble(disk, owner, as_primary): +def BlockdevAssemble(disk, owner, as_primary, idx): """Activate a block device for an instance. This is a wrapper over _RecursiveAssembleBD. @@ -1507,8 +1507,12 @@ def BlockdevAssemble(disk, owner, as_primary): if isinstance(result, bdev.BlockDev): # pylint: disable-msg=E1103 result = result.dev_path + if as_primary: + _SymlinkBlockDev(owner, result, idx) except errors.BlockDeviceError, err: _Fail("Error while assembling disk: %s", err, exc=True) + except OSError, err: + _Fail("Error while symlinking disk: %s", err, exc=True) return result diff --git a/lib/cmdlib.py b/lib/cmdlib.py index 2e52a59..782768d 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -4783,13 +4783,13 @@ def _AssembleInstanceDisks(lu, instance, disks=None, ignore_secondaries=False, # SyncSource, etc.) # 1st pass, assemble on all nodes in secondary mode - for inst_disk in disks: + for idx, inst_disk in enumerate(disks): for node, node_disk in inst_disk.ComputeNodeTree(instance.primary_node): if ignore_size: node_disk = node_disk.Copy() node_disk.UnsetSize() lu.cfg.SetDiskID(node_disk, node) - result = lu.rpc.call_blockdev_assemble(node, node_disk, iname, False) + result = lu.rpc.call_blockdev_assemble(node, node_disk, iname, False, idx) msg = result.fail_msg if msg: lu.proc.LogWarning("Could not prepare block device %s on node %s" @@ -4801,7 +4801,7 @@ def _AssembleInstanceDisks(lu, instance, disks=None, ignore_secondaries=False, # FIXME: race condition on drbd migration to primary # 2nd pass, do only the primary node - for inst_disk in disks: + for idx, inst_disk in enumerate(disks): dev_path = None for node, node_disk in inst_disk.ComputeNodeTree(instance.primary_node): @@ -4811,7 +4811,7 @@ def _AssembleInstanceDisks(lu, instance, disks=None, ignore_secondaries=False, node_disk = node_disk.Copy() node_disk.UnsetSize() lu.cfg.SetDiskID(node_disk, node) - result = lu.rpc.call_blockdev_assemble(node, node_disk, iname, True) + result = lu.rpc.call_blockdev_assemble(node, node_disk, iname, True, idx) msg = result.fail_msg if msg: lu.proc.LogWarning("Could not prepare block device %s on node %s" @@ -5949,7 +5949,7 @@ class LUInstanceMove(LogicalUnit): for idx, disk in enumerate(instance.disks): self.LogInfo("Copying data for disk %d", idx) result = self.rpc.call_blockdev_assemble(target_node, disk, - instance.name, True) + instance.name, True, idx) if result.fail_msg: self.LogWarning("Can't assemble newly created disk %d: %s", idx, result.fail_msg) diff --git a/lib/rpc.py b/lib/rpc.py index 633dc6a..bd625de 100644 --- a/lib/rpc.py +++ b/lib/rpc.py @@ -999,14 +999,14 @@ class RpcRunner(object): [[bdev.ToDict() for bdev in disks], pause]) @_RpcTimeout(_TMO_NORMAL) - def call_blockdev_assemble(self, node, disk, owner, on_primary): + def call_blockdev_assemble(self, node, disk, owner, on_primary, idx): """Request assembling of a given block device. This is a single-node call. """ return self._SingleNodeCall(node, "blockdev_assemble", - [disk.ToDict(), owner, on_primary]) + [disk.ToDict(), owner, on_primary, idx]) @_RpcTimeout(_TMO_NORMAL) def call_blockdev_shutdown(self, node, disk): diff --git a/lib/server/noded.py b/lib/server/noded.py index bf557bc..decc874 100644 --- a/lib/server/noded.py +++ b/lib/server/noded.py @@ -1,7 +1,7 @@ # # -# Copyright (C) 2006, 2007, 2010 Google Inc. +# Copyright (C) 2006, 2007, 2010, 2011 Google Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -223,11 +223,11 @@ class NodeHttpServer(http.server.HttpServer): """Assemble a block device. """ - bdev_s, owner, on_primary = params + bdev_s, owner, on_primary, idx = params bdev = objects.Disk.FromDict(bdev_s) if bdev is None: raise ValueError("can't unserialize data!") - return backend.BlockdevAssemble(bdev, owner, on_primary) + return backend.BlockdevAssemble(bdev, owner, on_primary, idx) @staticmethod def perspective_blockdev_shutdown(params):