diff --git a/service/matching/task_queue_partition_manager.go b/service/matching/task_queue_partition_manager.go index b17065c916..e67ceaba20 100644 --- a/service/matching/task_queue_partition_manager.go +++ b/service/matching/task_queue_partition_manager.go @@ -1035,6 +1035,7 @@ func (pm *taskQueuePartitionManagerImpl) describe( if b == "" { dbq := pm.defaultQueue() if dbq == nil { + pm.versionedQueuesLock.RUnlock() return nil, errDefaultQueueNotInit } versions[dbq.QueueKey().Version()] = true diff --git a/service/matching/task_queue_partition_manager_test.go b/service/matching/task_queue_partition_manager_test.go index 780f50fbc7..c1306e4e60 100644 --- a/service/matching/task_queue_partition_manager_test.go +++ b/service/matching/task_queue_partition_manager_test.go @@ -22,6 +22,8 @@ import ( taskqueuespb "go.temporal.io/server/api/taskqueue/v1" hlc "go.temporal.io/server/common/clock/hybrid_logical_clock" "go.temporal.io/server/common/dynamicconfig" + "go.temporal.io/server/common/future" + "go.temporal.io/server/common/log" "go.temporal.io/server/common/metrics" "go.temporal.io/server/common/metrics/metricstest" "go.temporal.io/server/common/namespace" @@ -71,6 +73,34 @@ func TestTaskQueuePartitionManager_Fair_Suite(t *testing.T) { suite.Run(t, &PartitionManagerTestSuite{newMatcher: true, fairness: true}) } +func TestDescribeReleasesVersionedQueuesLockWhenDefaultQueueNotInitialized(t *testing.T) { + t.Parallel() + + pm := &taskQueuePartitionManagerImpl{ + versionedQueues: make(map[PhysicalTaskQueueVersion]physicalTaskQueueManager), + defaultQueueFuture: future.NewFuture[physicalTaskQueueManager](), + logger: log.NewNoopLogger(), + } + + _, err := pm.describe(context.Background(), map[string]bool{"": true}, false, false, false, false, false) + if !errors.Is(err, errDefaultQueueNotInit) { + t.Fatalf("describe() error = %v, want %v", err, errDefaultQueueNotInit) + } + + lockAcquired := make(chan struct{}) + go func() { + pm.versionedQueuesLock.Lock() + defer pm.versionedQueuesLock.Unlock() + close(lockAcquired) + }() + + select { + case <-lockAcquired: + case <-time.After(time.Second): + t.Fatal("versionedQueuesLock remained locked after describe returned") + } +} + func (s *PartitionManagerTestSuite) SetupTest() { s.ProtoAssertions = protorequire.New(s.T()) s.controller = gomock.NewController(s.T())