diff --git a/internal/querynode/shard_cluster.go b/internal/querynode/shard_cluster.go index 34b44df30b..afd1772b68 100644 --- a/internal/querynode/shard_cluster.go +++ b/internal/querynode/shard_cluster.go @@ -863,7 +863,14 @@ func (sc *ShardCluster) Query(ctx context.Context, req *querypb.QueryRequest, wi } func (sc *ShardCluster) GetSegmentInfos() []SegmentEntry { - items, version := sc.distribution.GetCurrent() + sc.mutVersion.RLock() + distribution := sc.distribution + sc.mutVersion.RUnlock() + // before setup version + if distribution == nil { + return nil + } + items, version := distribution.GetCurrent() sc.finishUsage(version) var result []SegmentEntry diff --git a/internal/querynode/shard_cluster_test.go b/internal/querynode/shard_cluster_test.go index 461a38c4f5..9fecd55567 100644 --- a/internal/querynode/shard_cluster_test.go +++ b/internal/querynode/shard_cluster_test.go @@ -2128,3 +2128,15 @@ func (suite *ShardClusterSuite) TestReleaseSegments() { func TestShardClusterSuite(t *testing.T) { suite.Run(t, new(ShardClusterSuite)) } + +// ut for https://github.com/milvus-io/milvus/issues/22312 +func TestGetSegmentInfoBeforeSetup(t *testing.T) { + + sc := NewShardCluster(100, 1000, "testChannel", 0, + &mockNodeDetector{}, &mockSegmentDetector{}, buildMockQueryNode) + + assert.NotPanics(t, func() { + result := sc.GetSegmentInfos() + assert.Nil(t, result) + }) +}