Revision c1bfc2eb

b/lib/cmdlib.py
1678 1678
  return iallocator
1679 1679

  
1680 1680

  
1681
def _InstanceRunning(lu, instance):
1682
  """Return True if instance is running else False."""
1683

  
1684
  remote_info = lu.rpc.call_instance_info(instance.primary_node,
1685
                                          instance.name,
1686
                                          instance.hypervisor)
1687
  remote_info.Raise("Error checking node %s" % instance.primary_node)
1688
  instance_running = bool(remote_info.payload)
1689
  return instance_running
1690

  
1691

  
1681 1692
class LUClusterPostInit(LogicalUnit):
1682 1693
  """Logical unit for running hooks after cluster initialization.
1683 1694

  
......
8726 8737
        return idx, pci
8727 8738
    # case of InstanceSetParams()
8728 8739
    elif lu.instance.hotplug_info is not None:
8729
      idx, pci = lu.cfg.GetPCIInfo(lu.instance.name, dev_type)
8740
      idx, pci = lu.cfg.GetPCIInfo(lu.instance, dev_type)
8730 8741
      lu.LogInfo("Choosing pci slot %d" % pci)
8731 8742
      return idx, pci
8732 8743

  
......
12819 12830
        self.LogWarning("Failed to create volume %s (%s) on node '%s': %s",
12820 12831
                        disk.iv_name, disk, node, err)
12821 12832

  
12822
    if self.op.hotplug and disk.pci:
12833
    if self.op.hotplug and disk.pci and _InstanceRunning(self, self.instance):
12823 12834
      self.LogInfo("Trying to hotplug device.")
12824 12835
      _, device_info = _AssembleInstanceDisks(self, self.instance,
12825 12836
                                                    [disk], check=False)
......
12854 12865
                                 " without removing it with hotplug",
12855 12866
                                 errors.ECODE_INVAL)
12856 12867
    if self.op.hotplug and root.pci:
12857
      self.LogInfo("Trying to hotplug device.")
12858
      self.rpc.call_hot_del_disk(self.instance.primary_node,
12859
                                 self.instance, root, idx)
12860
      _ShutdownInstanceDisks(self, self.instance, [root])
12861
      self.cfg.UpdatePCIInfo(self.instance.name, root.pci)
12868
      if _InstanceRunning(self, self.instance):
12869
        self.LogInfo("Trying to hotplug device.")
12870
        self.rpc.call_hot_del_disk(self.instance.primary_node,
12871
                                   self.instance, root, idx)
12872
        _ShutdownInstanceDisks(self, self.instance, [root])
12873
      self.cfg.UpdatePCIInfo(self.instance, root.pci)
12862 12874

  
12863 12875
    (anno_disk,) = _AnnotateDiskParams(self.instance, [root], self.cfg)
12864 12876
    for node, disk in anno_disk.ComputeNodeTree(self.instance.primary_node):
......
12887 12899
    #      handle errors
12888 12900
    #      return changes
12889 12901
    if self.op.hotplug:
12890
      nic_idx, pci = _GetPCIInfo(self, 'nics')
12891
      if pci is not None:
12892
        nic.idx = nic_idx
12893
        nic.pci = pci
12902
      nic.idx, nic.pci = _GetPCIInfo(self, 'nics')
12903
      if nic.pci is not None and _InstanceRunning(self, self.instance):
12894 12904
        self.rpc.call_hot_add_nic(self.instance.primary_node,
12895 12905
                                  self.instance, nic, idx)
12896 12906
    desc =  [
......
12920 12930

  
12921 12931
    #TODO: log warning in case hotplug is not possible
12922 12932
    #      handle errors
12923
    if self.op.hotplug and nic.pci:
12933
    if self.op.hotplug and nic.pci and _InstanceRunning(self, self.instance):
12924 12934
      self.LogInfo("Trying to hotplug device.")
12925 12935
      self.rpc.call_hot_del_nic(self.instance.primary_node,
12926 12936
                                self.instance, nic, idx)
......
12936 12946
    #TODO: log warning in case hotplug is not possible
12937 12947
    #      handle errors
12938 12948
    if self.op.hotplug and nic.pci:
12939
      self.LogInfo("Trying to hotplug device.")
12940
      self.rpc.call_hot_del_nic(self.instance.primary_node,
12941
                                self.instance, nic, idx)
12942
      self.cfg.UpdatePCIInfo(self.instance.name, nic.pci)
12949
      if _InstanceRunning(self, self.instance):
12950
        self.LogInfo("Trying to hotplug device.")
12951
        self.rpc.call_hot_del_nic(self.instance.primary_node,
12952
                                  self.instance, nic, idx)
12953
      self.cfg.UpdatePCIInfo(self.instance, nic.pci)
12943 12954

  
12944 12955

  
12945 12956
  def Exec(self, feedback_fn):
b/lib/config.py
289 289
    else:
290 290
      self._temporary_macs.Reserve(ec_id, mac)
291 291

  
292
  @locking.ssynchronized(_config_lock, shared=1)
293
  def GetPCIInfo(self, instance_name, dev_type):
292
  @locking.ssynchronized(_config_lock)
293
  def GetPCIInfo(self, instance, dev_type):
294 294

  
295
    instance = self._UnlockedGetInstanceInfo(instance_name)
296 295
    if not instance.hotplug_info:
297
      return None, None 
296
      return None, None
298 297
    idx = getattr(instance.hotplug_info, dev_type)
299 298
    setattr(instance.hotplug_info, dev_type, idx+1)
300 299
    pci = instance.hotplug_info.pci_pool.pop()
......
302 301

  
303 302
    return idx, pci
304 303

  
305
  @locking.ssynchronized(_config_lock, shared=1)
306
  def UpdatePCIInfo(self, instance_name, pci_slot):
304
  @locking.ssynchronized(_config_lock)
305
  def UpdatePCIInfo(self, instance, pci_slot):
307 306

  
308
    instance = self._UnlockedGetInstanceInfo(instance_name)
309 307
    if instance.hotplug_info:
308
      logging.info("Releasing PCI slot %d for instance %s",
309
                    pci_slot, instance.name)
310 310
      instance.hotplug_info.pci_pool.append(pci_slot)
311 311
      self._WriteConfig()
312 312

  

Also available in: Unified diff