in pkg/common/connectionmanager/search.go [233:378]
func (cm *ConnectionManager) WhichVCandDCByFCDId(ctx context.Context, fcdID string) (*FcdDiscoveryInfo, error) {
if fcdID == "" {
klog.V(3).Info("WhichVCandDCByFCDId called but fcdID is empty")
return nil, vclib.ErrNoDiskIDFound
}
klog.V(2).Info("WhichVCandDCByFCDId fcdID: ", fcdID)
type fcdSearch struct {
tenantRef string
vc string
datacenter *vclib.Datacenter
}
var mutex = &sync.Mutex{}
var globalErrMutex = &sync.Mutex{}
var queueChannel chan *fcdSearch
var wg sync.WaitGroup
var globalErr *error
queueChannel = make(chan *fcdSearch, QueueSize)
fcdFound := false
globalErr = nil
setGlobalErr := func(err error) {
globalErrMutex.Lock()
globalErr = &err
globalErrMutex.Unlock()
}
setFCDFound := func(found bool) {
mutex.Lock()
fcdFound = found
mutex.Unlock()
}
getFCDFound := func() bool {
mutex.Lock()
found := fcdFound
mutex.Unlock()
return found
}
go func() {
for _, vsi := range cm.VsphereInstanceMap {
var datacenterObjs []*vclib.Datacenter
if getFCDFound() {
break
}
var err error
for i := 0; i < NumConnectionAttempts; i++ {
err = cm.Connect(ctx, vsi)
if err == nil {
break
}
time.Sleep(time.Duration(RetryAttemptDelaySecs) * time.Second)
}
if err != nil {
klog.Error("WhichVCandDCByFCDId error vc:", err)
setGlobalErr(err)
continue
}
if vsi.Cfg.Datacenters == "" {
datacenterObjs, err = vclib.GetAllDatacenter(ctx, vsi.Conn)
if err != nil {
klog.Error("WhichVCandDCByFCDId error dc:", err)
setGlobalErr(err)
continue
}
} else {
datacenters := strings.Split(vsi.Cfg.Datacenters, ",")
for _, dc := range datacenters {
dc = strings.TrimSpace(dc)
if dc == "" {
continue
}
datacenterObj, err := vclib.GetDatacenter(ctx, vsi.Conn, dc)
if err != nil {
klog.Error("WhichVCandDCByFCDId error dc:", err)
setGlobalErr(err)
continue
}
datacenterObjs = append(datacenterObjs, datacenterObj)
}
}
for _, datacenterObj := range datacenterObjs {
if getFCDFound() {
break
}
klog.V(4).Infof("Finding FCD %s in vc=%s and datacenter=%s", fcdID, vsi.Cfg.VCenterIP, datacenterObj.Name())
queueChannel <- &fcdSearch{
tenantRef: vsi.Cfg.TenantRef,
vc: vsi.Cfg.VCenterIP,
datacenter: datacenterObj,
}
}
}
close(queueChannel)
}()
var fcdInfo *FcdDiscoveryInfo
for i := 0; i < PoolSize; i++ {
wg.Add(1)
go func() {
for res := range queueChannel {
fcd, err := res.datacenter.DoesFirstClassDiskExist(ctx, fcdID)
if err != nil {
klog.Errorf("Error while looking for FCD=%+v in vc=%s and datacenter=%s: %v",
fcd, res.vc, res.datacenter.Name(), err)
if err != vclib.ErrNoDiskIDFound {
setGlobalErr(err)
} else {
klog.V(2).Infof("Did not find FCD %s in vc=%s and datacenter=%s",
fcdID, res.vc, res.datacenter.Name())
}
continue
}
klog.V(2).Infof("Found FCD %s as vm=%+v in vc=%s and datacenter=%s",
fcdID, fcd, res.vc, res.datacenter.Name())
fcdInfo = &FcdDiscoveryInfo{TenantRef: res.tenantRef, DataCenter: res.datacenter, FCDInfo: fcd, VcServer: res.vc}
setFCDFound(true)
break
}
wg.Done()
}()
}
wg.Wait()
if fcdFound {
return fcdInfo, nil
}
if globalErr != nil {
return nil, *globalErr
}
klog.V(4).Infof("WhichVCandDCByFCDId: %q FCD not found", fcdID)
return nil, vclib.ErrNoDiskIDFound
}