fix: querynode upgrade from 2.5 get stucked (#42502)

issue: #42492

- consider the old RO query node (not streaming node) when balancing
channel.
- querynode graceful stop can be done if there's only L0 segment exists.

Signed-off-by: chyezh <chyezh@outlook.com>
This commit is contained in:
Zhen Ye 2025-06-04 11:20:30 +08:00 committed by GitHub
parent b76478378a
commit 508264f953
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 13 additions and 2 deletions

View File

@ -499,6 +499,7 @@ func (b *MultiTargetBalancer) balanceChannels(ctx context.Context, br *balanceRe
var rwNodes, roNodes []int64 var rwNodes, roNodes []int64
if streamingutil.IsStreamingServiceEnabled() { if streamingutil.IsStreamingServiceEnabled() {
rwNodes, roNodes = replica.GetRWSQNodes(), replica.GetROSQNodes() rwNodes, roNodes = replica.GetRWSQNodes(), replica.GetROSQNodes()
roNodes = append(roNodes, replica.GetRONodes()...)
} else { } else {
rwNodes, roNodes = replica.GetRWNodes(), replica.GetRONodes() rwNodes, roNodes = replica.GetRWNodes(), replica.GetRONodes()
} }

View File

@ -209,6 +209,7 @@ func (b *RowCountBasedBalancer) balanceChannels(ctx context.Context, br *balance
var rwNodes, roNodes []int64 var rwNodes, roNodes []int64
if streamingutil.IsStreamingServiceEnabled() { if streamingutil.IsStreamingServiceEnabled() {
rwNodes, roNodes = replica.GetRWSQNodes(), replica.GetROSQNodes() rwNodes, roNodes = replica.GetRWSQNodes(), replica.GetROSQNodes()
roNodes = append(roNodes, replica.GetRONodes()...)
} else { } else {
rwNodes, roNodes = replica.GetRWNodes(), replica.GetRONodes() rwNodes, roNodes = replica.GetRWNodes(), replica.GetRONodes()
} }

View File

@ -481,6 +481,7 @@ func (b *ScoreBasedBalancer) balanceChannels(ctx context.Context, br *balanceRep
var roNodes []int64 var roNodes []int64
if streamingutil.IsStreamingServiceEnabled() { if streamingutil.IsStreamingServiceEnabled() {
rwNodes, roNodes = replica.GetRWSQNodes(), replica.GetROSQNodes() rwNodes, roNodes = replica.GetRWSQNodes(), replica.GetROSQNodes()
roNodes = append(roNodes, replica.GetRONodes()...)
} else { } else {
rwNodes, roNodes = replica.GetRWNodes(), replica.GetRONodes() rwNodes, roNodes = replica.GetRWNodes(), replica.GetRONodes()
} }

View File

@ -140,3 +140,10 @@ func WithLevel(level datapb.SegmentLevel) SegmentFilter {
return segment.Level() == level return segment.Level() == level
}) })
} }
// WithoutLevel is the segment filter for without segment level.
func WithoutLevel(level datapb.SegmentLevel) SegmentFilter {
return SegmentFilterFunc(func(segment Segment) bool {
return segment.Level() != level
})
}

View File

@ -70,6 +70,7 @@ import (
"github.com/milvus-io/milvus/pkg/v2/log" "github.com/milvus-io/milvus/pkg/v2/log"
"github.com/milvus-io/milvus/pkg/v2/metrics" "github.com/milvus-io/milvus/pkg/v2/metrics"
"github.com/milvus-io/milvus/pkg/v2/mq/msgdispatcher" "github.com/milvus-io/milvus/pkg/v2/mq/msgdispatcher"
"github.com/milvus-io/milvus/pkg/v2/proto/datapb"
"github.com/milvus-io/milvus/pkg/v2/util/expr" "github.com/milvus-io/milvus/pkg/v2/util/expr"
"github.com/milvus-io/milvus/pkg/v2/util/hardware" "github.com/milvus-io/milvus/pkg/v2/util/hardware"
"github.com/milvus-io/milvus/pkg/v2/util/lifetime" "github.com/milvus-io/milvus/pkg/v2/util/lifetime"
@ -555,8 +556,8 @@ func (node *QueryNode) Stop() error {
channelNum = 0 channelNum = 0
) )
if node.manager != nil { if node.manager != nil {
sealedSegments = node.manager.Segment.GetBy(segments.WithType(segments.SegmentTypeSealed)) sealedSegments = node.manager.Segment.GetBy(segments.WithType(segments.SegmentTypeSealed), segments.WithoutLevel(datapb.SegmentLevel_L0))
growingSegments = node.manager.Segment.GetBy(segments.WithType(segments.SegmentTypeGrowing)) growingSegments = node.manager.Segment.GetBy(segments.WithType(segments.SegmentTypeGrowing), segments.WithoutLevel(datapb.SegmentLevel_L0))
} }
if node.pipelineManager != nil { if node.pipelineManager != nil {
channelNum = node.pipelineManager.Num() channelNum = node.pipelineManager.Num()