Skip to content

Commit 4388b5d

Browse files
committed
fix: filter deleted indexes in GetIndexedSegments to prevent stale segment loading
GetIndexedSegments included deleted index entries in targetIndices but skipped them in the counting loop, causing indexedFields to never equal len(targetIndices) when deleted entries existed. This made every segment appear unindexed after drop+create index cycles, forcing GetQueryVChanPositions to fall back to loading stale pre-compaction segments instead of the optimized one. pr: milvus-io#48558 See also: milvus-io#48557 Signed-off-by: yangxuan <xuan.yang@zilliz.com>
1 parent f14a835 commit 4388b5d

File tree

2 files changed

+30
-5
lines changed

2 files changed

+30
-5
lines changed

internal/datacoord/index_meta.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,7 @@ func (m *indexMeta) GetIndexedSegments(collectionID int64, segmentIDs, fieldIDs
562562
matchedFields := typeutil.NewUniqueSet()
563563

564564
targetIndices := lo.Filter(lo.Values(fieldIndexes), func(index *model.Index, _ int) bool {
565-
return fieldIDSet.Contain(index.FieldID)
565+
return fieldIDSet.Contain(index.FieldID) && !index.IsDeleted
566566
})
567567
for _, index := range targetIndices {
568568
matchedFields.Insert(index.FieldID)
@@ -576,10 +576,6 @@ func (m *indexMeta) GetIndexedSegments(collectionID int64, segmentIDs, fieldIDs
576576
checkSegmentState := func(indexes *typeutil.ConcurrentMap[UniqueID, *model.SegmentIndex]) bool {
577577
indexedFields := 0
578578
for _, index := range targetIndices {
579-
if !fieldIDSet.Contain(index.FieldID) || index.IsDeleted {
580-
continue
581-
}
582-
583579
if segIdx, ok := indexes.Get(index.IndexID); ok && segIdx.IndexState == commonpb.IndexState_Finished {
584580
indexedFields += 1
585581
}

internal/datacoord/index_meta_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -816,6 +816,35 @@ func TestMeta_GetIndexedSegment(t *testing.T) {
816816
segments := m.GetIndexedSegments(collID+1, []int64{segID}, []int64{fieldID})
817817
assert.Len(t, segments, 0)
818818
})
819+
820+
t.Run("with deleted index entries", func(t *testing.T) {
821+
// Simulate drop+create index cycles: add deleted index entries for the same field.
822+
// Previously, deleted entries inflated len(targetIndices), causing the indexed check
823+
// to always fail (indexedFields=1 != len(targetIndices)=N).
824+
deletedIndexID1 := indexID + 100
825+
deletedIndexID2 := indexID + 200
826+
m.indexes[collID][deletedIndexID1] = &model.Index{
827+
CollectionID: collID,
828+
FieldID: fieldID,
829+
IndexID: deletedIndexID1,
830+
IndexName: "old_idx_1",
831+
IsDeleted: true,
832+
}
833+
m.indexes[collID][deletedIndexID2] = &model.Index{
834+
CollectionID: collID,
835+
FieldID: fieldID,
836+
IndexID: deletedIndexID2,
837+
IndexName: "old_idx_2",
838+
IsDeleted: true,
839+
}
840+
841+
segments := m.GetIndexedSegments(collID, []int64{segID}, []int64{fieldID})
842+
assert.Len(t, segments, 1, "segment should be indexed even with deleted index entries")
843+
844+
// Cleanup
845+
delete(m.indexes[collID], deletedIndexID1)
846+
delete(m.indexes[collID], deletedIndexID2)
847+
})
819848
}
820849

821850
func TestMeta_MarkIndexAsDeleted(t *testing.T) {

0 commit comments

Comments
 (0)