From c87c2b384b8ff019a5cc93094250fc882eb2b903 Mon Sep 17 00:00:00 2001 From: Zexi Li Date: Mon, 14 Dec 2020 16:40:09 +0800 Subject: [PATCH] fix(scheduler): sku filter check zone if only prefer region specified --- .../algorithm/predicates/sku_predicate.go | 16 ++++++++++++++-- pkg/scheduler/data_manager/sku/sku.go | 16 +++++++++------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/pkg/scheduler/algorithm/predicates/sku_predicate.go b/pkg/scheduler/algorithm/predicates/sku_predicate.go index 46149db707..936e75fb40 100644 --- a/pkg/scheduler/algorithm/predicates/sku_predicate.go +++ b/pkg/scheduler/algorithm/predicates/sku_predicate.go @@ -55,9 +55,21 @@ func (p *InstanceTypePredicate) Execute(u *core.Unit, c core.Candidater) (bool, reqZone := d.PreferZone if reqRegion != "" && reqZone == "" { - sku := skuman.GetByRegion(instanceType, regionId) - if sku == nil { + skus := skuman.GetByRegion(instanceType, regionId) + if len(skus) == 0 { h.Exclude(fmt.Sprintf("Not found server sku %s at region %s", instanceType, regionName)) + } else { + zoneMatch := false + for idx := range skus { + sku := skus[idx] + if sku.ZoneId == zoneId { + zoneMatch = true + break + } + } + if !zoneMatch { + h.Exclude(fmt.Sprintf("Not found server sku %s at zone %s", instanceType, zoneName)) + } } } else { sku := skuman.GetByZone(instanceType, zoneId) diff --git a/pkg/scheduler/data_manager/sku/sku.go b/pkg/scheduler/data_manager/sku/sku.go index 9247e7c8c9..8daf694ec5 100644 --- a/pkg/scheduler/data_manager/sku/sku.go +++ b/pkg/scheduler/data_manager/sku/sku.go @@ -56,7 +56,7 @@ func GetByZone(instanceType, zoneId string) *ServerSku { return skuManager.GetByZone(instanceType, zoneId) } -func GetByRegion(instanceType, regionId string) *ServerSku { +func GetByRegion(instanceType, regionId string) []*ServerSku { return skuManager.GetByRegion(instanceType, regionId) } @@ -86,13 +86,15 @@ func (l skuList) DebugString() string { return fmt.Sprintf("%s", jsonutils.Marshal(l).String()) } -func (l skuList) GetByRegion(regionId string) *ServerSku { - for _, s := range l { - if s.RegionId == regionId { - return s +func (l skuList) GetByRegion(regionId string) []*ServerSku { + ret := make([]*ServerSku, 0) + for idx := range l { + sku := l[idx] + if sku.RegionId == regionId { + ret = append(ret, sku) } } - return nil + return ret } func (l skuList) GetByZone(zoneId string) *ServerSku { @@ -167,7 +169,7 @@ func (m *SSkuManager) GetByZone(instanceType, zoneId string) *ServerSku { return l.GetByZone(zoneId) } -func (m *SSkuManager) GetByRegion(instanceType, regionId string) *ServerSku { +func (m *SSkuManager) GetByRegion(instanceType, regionId string) []*ServerSku { l := m.skuMap.Get(instanceType) if l == nil { return nil