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
if streamingutil.IsStreamingServiceEnabled() {
rwNodes, roNodes = replica.GetRWSQNodes(), replica.GetROSQNodes()
roNodes = append(roNodes, replica.GetRONodes()...)
} else {
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
if streamingutil.IsStreamingServiceEnabled() {
rwNodes, roNodes = replica.GetRWSQNodes(), replica.GetROSQNodes()
roNodes = append(roNodes, replica.GetRONodes()...)
} else {
rwNodes, roNodes = replica.GetRWNodes(), replica.GetRONodes()
}

View File

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

View File

@ -140,3 +140,10 @@ func WithLevel(level datapb.SegmentLevel) SegmentFilter {
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/metrics"
"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/hardware"
"github.com/milvus-io/milvus/pkg/v2/util/lifetime"
@ -555,8 +556,8 @@ func (node *QueryNode) Stop() error {
channelNum = 0
)
if node.manager != nil {
sealedSegments = node.manager.Segment.GetBy(segments.WithType(segments.SegmentTypeSealed))
growingSegments = node.manager.Segment.GetBy(segments.WithType(segments.SegmentTypeGrowing))
sealedSegments = node.manager.Segment.GetBy(segments.WithType(segments.SegmentTypeSealed), segments.WithoutLevel(datapb.SegmentLevel_L0))
growingSegments = node.manager.Segment.GetBy(segments.WithType(segments.SegmentTypeGrowing), segments.WithoutLevel(datapb.SegmentLevel_L0))
}
if node.pipelineManager != nil {
channelNum = node.pipelineManager.Num()