From 4fcb1b597ecb377c7f9979ba03b6114dbd4ccea2 Mon Sep 17 00:00:00 2001 From: Michael Hanselmann <hansmi@google.com> Date: Tue, 16 Feb 2010 16:58:48 +0100 Subject: [PATCH] cmdlib: Convert instance export to new style MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit With this change, exports of several disks will occur in parallel. Error handling has also been improved. Signed-off-by: Michael Hanselmann <hansmi@google.com> Reviewed-by: RenΓ© Nussbaumer <rn@google.com> --- lib/cmdlib.py | 52 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/lib/cmdlib.py b/lib/cmdlib.py index bc540842d..2cb1300b2 100644 --- a/lib/cmdlib.py +++ b/lib/cmdlib.py @@ -46,6 +46,9 @@ from ganeti import serializer from ganeti import ssconf from ganeti import uidpool from ganeti import compat +from ganeti import masterd + +import ganeti.masterd.instance # pylint: disable-msg=W0611 class LogicalUnit(object): @@ -9015,7 +9018,6 @@ class LUExportInstance(LogicalUnit): try: # per-disk results - dresults = [] removed_snaps = [False] * len(instance.disks) snap_disks = None @@ -9038,28 +9040,36 @@ class LUExportInstance(LogicalUnit): # TODO: check for size - cluster_name = self.cfg.GetClusterName() + def _TransferFinished(idx): + logging.debug("Transfer %s finished", idx) + if self._RemoveSnapshot(feedback_fn, snap_disks, idx): + removed_snaps[idx] = True + + transfers = [] + for idx, dev in enumerate(snap_disks): - feedback_fn("Exporting snapshot %s from %s to %s" % - (idx, src_node, dst_node.name)) - if dev: - # FIXME: pass debug from opcode to backend - result = self.rpc.call_snapshot_export(src_node, dev, dst_node.name, - instance, cluster_name, - idx, self.op.debug_level) - msg = result.fail_msg - if msg: - self.LogWarning("Could not export disk/%s from node %s to" - " node %s: %s", idx, src_node, dst_node.name, msg) - dresults.append(False) - else: - dresults.append(True) + if not dev: + transfers.append(None) + continue - # Remove snapshot - if self._RemoveSnapshot(feedback_fn, snap_disks, idx): - removed_snaps[idx] = True - else: - dresults.append(False) + path = utils.PathJoin(constants.EXPORT_DIR, "%s.new" % instance.name, + dev.physical_id[1]) + + finished_fn = compat.partial(_TransferFinished, idx) + + # FIXME: pass debug option from opcode to backend + dt = masterd.instance.DiskTransfer("snapshot/%s" % idx, + constants.IEIO_SCRIPT, (dev, idx), + constants.IEIO_FILE, (path, ), + finished_fn) + transfers.append(dt) + + # Actually export data + dresults = \ + masterd.instance.TransferInstanceData(self, feedback_fn, + src_node, dst_node.name, + dst_node.secondary_ip, + instance, transfers) assert len(dresults) == len(instance.disks) -- GitLab