2021
deployment *deploymentpb.Deployment,
2022
create bool,
2024
>
key := PhysicalTaskQueueVersion{
2025
>
versionSet: versionSet,
2026
>
buildId: buildId,
2027
>
}
2028
>
if deployment != nil {
2029
key.deploymentSeriesName = deployment.GetSeriesName()
2030
key.buildId = deployment.GetBuildId()
2031
}
2032
2034
>
vq, ok := pm.versionedQueues[key]
2035
>
pm.versionedQueuesLock.RUnlock()
2036
>
if !ok {
2037
>
if !create {
2038
return nil, nil
2039
}
2040
2041
// If it gets here, write lock and check again in case a task queue is created between the two locks
2043
>
vq, ok = pm.versionedQueues[key]
2044
>
if !ok {
2045
>
var err error
2046
>
var dbq *PhysicalTaskQueueKey
2047
>
if deployment != nil {
2048
dbq = DeploymentQueueKey(pm.partition, deployment)
2050
dbq = BuildIdQueueKey(pm.partition, buildId)
2051
} else {
2052
dbq = VersionSetQueueKey(pm.partition, versionSet)
2053
}
2055
>
if err != nil {
2056
pm.versionedQueuesLock.Unlock()
2057
return nil, err
2058
}
2060
}
2062
>
2063
>
if !ok {
2064
>
vq.Start()
2065
>
}
2066
}
2068
}
2069