From 3ac159eae0eaa3a2b41b968a1a15073a23ce7217 Mon Sep 17 00:00:00 2001 From: Zexi Li Date: Tue, 6 Aug 2024 10:15:42 +0800 Subject: [PATCH] feat(region): select isolated_device by most unused device_path count (#20964) --- pkg/compute/models/isolated_devices.go | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/pkg/compute/models/isolated_devices.go b/pkg/compute/models/isolated_devices.go index 500113d0a5..64cc742069 100644 --- a/pkg/compute/models/isolated_devices.go +++ b/pkg/compute/models/isolated_devices.go @@ -614,7 +614,30 @@ func (manager *SIsolatedDeviceManager) attachHostDeviceToGuestByModel(ctx contex if err != nil || len(devs) == 0 { return fmt.Errorf("Can't found model %s on host %s", devConfig.Model, host.Id) } - selectedDev := devs[0] + // 1. group devices by device_path + groupDevs := make(map[string][]SIsolatedDevice, 0) + for i := range devs { + dev := devs[i] + devPath := dev.DevicePath + devs, ok := groupDevs[devPath] + if !ok { + devs = []SIsolatedDevice{dev} + } else { + devs = append(devs, dev) + } + groupDevs[devPath] = devs + } + // 2. select device by most unused count + var mostUnusedDevPath string + mostUnusedCount := 0 + for devPath := range groupDevs { + devs := groupDevs[devPath] + if len(devs) > mostUnusedCount { + mostUnusedDevPath = devPath + mostUnusedCount = len(devs) + } + } + selectedDev := groupDevs[mostUnusedDevPath][0] return guest.attachIsolatedDevice(ctx, userCred, &selectedDev, devConfig.NetworkIndex, devConfig.DiskIndex) }