Revision c417e115

b/lib/backend.py
1492 1492
  return result
1493 1493

  
1494 1494

  
1495
def BlockdevAssemble(disk, owner, as_primary):
1495
def BlockdevAssemble(disk, owner, as_primary, idx):
1496 1496
  """Activate a block device for an instance.
1497 1497

  
1498 1498
  This is a wrapper over _RecursiveAssembleBD.
......
1507 1507
    if isinstance(result, bdev.BlockDev):
1508 1508
      # pylint: disable-msg=E1103
1509 1509
      result = result.dev_path
1510
      if as_primary:
1511
        _SymlinkBlockDev(owner, result, idx)
1510 1512
  except errors.BlockDeviceError, err:
1511 1513
    _Fail("Error while assembling disk: %s", err, exc=True)
1514
  except OSError, err:
1515
    _Fail("Error while symlinking disk: %s", err, exc=True)
1512 1516

  
1513 1517
  return result
1514 1518

  
b/lib/cmdlib.py
4783 4783
  # SyncSource, etc.)
4784 4784

  
4785 4785
  # 1st pass, assemble on all nodes in secondary mode
4786
  for inst_disk in disks:
4786
  for idx, inst_disk in enumerate(disks):
4787 4787
    for node, node_disk in inst_disk.ComputeNodeTree(instance.primary_node):
4788 4788
      if ignore_size:
4789 4789
        node_disk = node_disk.Copy()
4790 4790
        node_disk.UnsetSize()
4791 4791
      lu.cfg.SetDiskID(node_disk, node)
4792
      result = lu.rpc.call_blockdev_assemble(node, node_disk, iname, False)
4792
      result = lu.rpc.call_blockdev_assemble(node, node_disk, iname, False, idx)
4793 4793
      msg = result.fail_msg
4794 4794
      if msg:
4795 4795
        lu.proc.LogWarning("Could not prepare block device %s on node %s"
......
4801 4801
  # FIXME: race condition on drbd migration to primary
4802 4802

  
4803 4803
  # 2nd pass, do only the primary node
4804
  for inst_disk in disks:
4804
  for idx, inst_disk in enumerate(disks):
4805 4805
    dev_path = None
4806 4806

  
4807 4807
    for node, node_disk in inst_disk.ComputeNodeTree(instance.primary_node):
......
4811 4811
        node_disk = node_disk.Copy()
4812 4812
        node_disk.UnsetSize()
4813 4813
      lu.cfg.SetDiskID(node_disk, node)
4814
      result = lu.rpc.call_blockdev_assemble(node, node_disk, iname, True)
4814
      result = lu.rpc.call_blockdev_assemble(node, node_disk, iname, True, idx)
4815 4815
      msg = result.fail_msg
4816 4816
      if msg:
4817 4817
        lu.proc.LogWarning("Could not prepare block device %s on node %s"
......
5949 5949
    for idx, disk in enumerate(instance.disks):
5950 5950
      self.LogInfo("Copying data for disk %d", idx)
5951 5951
      result = self.rpc.call_blockdev_assemble(target_node, disk,
5952
                                               instance.name, True)
5952
                                               instance.name, True, idx)
5953 5953
      if result.fail_msg:
5954 5954
        self.LogWarning("Can't assemble newly created disk %d: %s",
5955 5955
                        idx, result.fail_msg)
b/lib/rpc.py
999 999
                                [[bdev.ToDict() for bdev in disks], pause])
1000 1000

  
1001 1001
  @_RpcTimeout(_TMO_NORMAL)
1002
  def call_blockdev_assemble(self, node, disk, owner, on_primary):
1002
  def call_blockdev_assemble(self, node, disk, owner, on_primary, idx):
1003 1003
    """Request assembling of a given block device.
1004 1004

  
1005 1005
    This is a single-node call.
1006 1006

  
1007 1007
    """
1008 1008
    return self._SingleNodeCall(node, "blockdev_assemble",
1009
                                [disk.ToDict(), owner, on_primary])
1009
                                [disk.ToDict(), owner, on_primary, idx])
1010 1010

  
1011 1011
  @_RpcTimeout(_TMO_NORMAL)
1012 1012
  def call_blockdev_shutdown(self, node, disk):
b/lib/server/noded.py
1 1
#
2 2
#
3 3

  
4
# Copyright (C) 2006, 2007, 2010 Google Inc.
4
# Copyright (C) 2006, 2007, 2010, 2011 Google Inc.
5 5
#
6 6
# This program is free software; you can redistribute it and/or modify
7 7
# it under the terms of the GNU General Public License as published by
......
223 223
    """Assemble a block device.
224 224

  
225 225
    """
226
    bdev_s, owner, on_primary = params
226
    bdev_s, owner, on_primary, idx = params
227 227
    bdev = objects.Disk.FromDict(bdev_s)
228 228
    if bdev is None:
229 229
      raise ValueError("can't unserialize data!")
230
    return backend.BlockdevAssemble(bdev, owner, on_primary)
230
    return backend.BlockdevAssemble(bdev, owner, on_primary, idx)
231 231

  
232 232
  @staticmethod
233 233
  def perspective_blockdev_shutdown(params):

Also available in: Unified diff