← Back to team overview

yahoo-eng-team team mailing list archive

[Bug 1522232] Re: error occurs during attacthing volumes when there is no slots in SCSi controllers

 

Volume vmdk is attached to the instance in the Nova driver.

** No longer affects: cinder

-- 
You received this bug notification because you are a member of Yahoo!
Engineering Team, which is subscribed to OpenStack Compute (nova).
https://bugs.launchpad.net/bugs/1522232

Title:
  error occurs during attacthing volumes when there is no slots in SCSi
  controllers

Status in OpenStack Compute (nova):
  New

Bug description:
  There can be at most 15 virtual disk attached on an SCSi controller,
  so if the limitation is reached, a new controller should be
  automatically created.

  In nova/virt/vmwareapi/vm_util.py:

  def allocate_controller_key_and_unit_number(client_factory, devices,
                                              adapter_type):
      """This function inspects the current set of hardware devices and returns
      controller_key and unit_number that can be used for attaching a new virtual
      disk to adapter with the given adapter_type.
      """
      if devices.__class__.__name__ == "ArrayOfVirtualDevice":
          devices = devices.VirtualDevice

      taken = _find_allocated_slots(devices)

      ret = None
      if adapter_type == 'ide':
          ide_keys = [dev.key for dev in devices if _is_ide_controller(dev)]
          ret = _find_controller_slot(ide_keys, taken, 2)
      elif adapter_type in ['lsiLogic', 'lsiLogicsas', 'busLogic','paraVirtual']:
          scsi_keys = [dev.key for dev in devices if _is_scsi_controller(dev)]
          ret = _find_controller_slot(scsi_keys, taken, 16)
      if ret:
          return ret[0], ret[1], None

      # create new controller with the specified type and return its spec
      controller_key = -101
      controller_spec = create_controller_spec(client_factory, controller_key,
                                               adapter_type)
      return controller_key, 0, controller_spec

  Here we can see, if 'ret' is None, a 'create_controller_spec' is generated for the creation of a new controller.
  I tested this function, and I check the value of 'vmdk_attach_config_spec.deviceChange'
  [(VirtualDeviceConfigSpec){
     dynamicType = None
     dynamicProperty[] = <empty>
     operation = "add"
     fileOperation = "create"
     device =
        (VirtualDisk){
           dynamicType = None
           dynamicProperty[] = <empty>
           key = -100
           deviceInfo =
              (Description){
                 dynamicType = None
                 dynamicProperty[] = <empty>
                 label = None
                 summary = None
              }
           backing =
              (VirtualDiskRawDiskMappingVer1BackingInfo){
                 dynamicType = None
                 dynamicProperty[] = <empty>
                 fileName = ""
                 datastore =
                    (ManagedObjectReference){
                       value = None
                       _type = ""
                    }
                 backingObjectId = None
                 lunUuid = None
                 deviceName = "/vmfs/devices/disks/t10.IET_____001000010000000000000000000000000000000000000000"
                 compatibilityMode = "physicalMode"
                 diskMode = "independent_persistent"
                 uuid = None
                 contentId = None
                 changeId = None
                 parent =
                    (VirtualDiskRawDiskMappingVer1BackingInfo){
                       dynamicType = None
                       dynamicProperty[] = <empty>
                       fileName = None
                       datastore =
                          (ManagedObjectReference){
                             value = None
                             _type = ""
                          }
                       backingObjectId = None
                       lunUuid = None
                       deviceName = None
                       compatibilityMode = None
                       diskMode = None
                       uuid = None
                       contentId = None
                       changeId = None
                    }
              }
           connectable =
              (VirtualDeviceConnectInfo){
                 dynamicType = None
                 dynamicProperty[] = <empty>
                 startConnected = True
                 allowGuestControl = False
                 connected = True
                 status = None
              }
           slotInfo =
              (VirtualDeviceBusSlotInfo){
                 dynamicType = None
                 dynamicProperty[] = <empty>
              }
           controllerKey = -101
           unitNumber = 0
           capacityInKB = 0
           capacityInBytes = None
           shares =
              (SharesInfo){
                 dynamicType = None
                 dynamicProperty[] = <empty>
                 shares = None
                 level =
                    (SharesLevel){
                       value = None
                    }
              }
           storageIOAllocation =
              (StorageIOAllocationInfo){
                 dynamicType = None
                 dynamicProperty[] = <empty>
                 limit = None
                 shares =
                    (SharesInfo){
                       dynamicType = None
                       dynamicProperty[] = <empty>
                       shares = None
                       level =
                          (SharesLevel){
                             value = None
                          }
                    }
                 reservation = None
              }
           diskObjectId = None
           vFlashCacheConfigInfo =
              (VirtualDiskVFlashCacheConfigInfo){
                 dynamicType = None
                 dynamicProperty[] = <empty>
                 vFlashModule = None
                 reservationInMB = None
                 cacheConsistencyType = None
                 cacheMode = None
                 blockSizeInKB = None
              }
        }
     profile[] = <empty>
   }, (VirtualDeviceConfigSpec){
     dynamicType = None
     dynamicProperty[] = <empty>
     operation = "add"
     fileOperation =
        (VirtualDeviceConfigSpecFileOperation){
           value = None
        }
     device =
        (ParaVirtualSCSIController){
           dynamicType = None
           dynamicProperty[] = <empty>
           key = -101
           deviceInfo =
              (Description){
                 dynamicType = None
                 dynamicProperty[] = <empty>
                 label = None
                 summary = None
              }
           backing =
              (VirtualDeviceBackingInfo){
                 dynamicType = None
                 dynamicProperty[] = <empty>
              }
           connectable =
              (VirtualDeviceConnectInfo){
                 dynamicType = None
                 dynamicProperty[] = <empty>
                 startConnected = None
                 allowGuestControl = None
                 connected = None
                 status = None
              }
           slotInfo =
              (VirtualDeviceBusSlotInfo){
                 dynamicType = None
                 dynamicProperty[] = <empty>
              }
           controllerKey = None
           unitNumber = None
           busNumber = 0
           device[] = <empty>
           hotAddRemove = None
           sharedBus = "noSharing"
           scsiCtlrUnitNumber = None
        }
     profile[] = <empty>
   }]

  It really seems a request for creating a new controller, and then
  attach the virtual disk to it.

  But I met errors after this.
  In an icehouse environment, it is reported as "VMwareDriverException: Cannot modify existing SCSI device"
  In a kilo environment, it is reported as "VMwareDriverException: Number of virtual devices exceeds the maximum for a given controller."
  (their controller types are different, I don't know if this is the reason of the difference of the error messages)

  So, in a conclusion, my questions are:
  1.
  Is it designed to create a new controller when all existing controllers all reach their limits?
  2.
  If the answer of question 1 is yes, is this function tested to work?
  3.
  If the answers of question 1 and 2 are both yes, is my situation can be regard as a bug?

To manage notifications about this bug go to:
https://bugs.launchpad.net/nova/+bug/1522232/+subscriptions


References