Skip to content

Commit d6e631f

Browse files
committed
vecindex: suppress partition not found error in SearchPartitions
The SearchPartitions method is spec'd to return InvalidLevel for any partition that is not found in the tree. However, the vecstore was instead returning ErrPartitionNotFound, which was causing occasional insertion failures under stress. This commit updates the vecstore to suppress ErrPartitionNotFound, mapping it to a PartitionToSearch value of InvalidLevel, MissingState and Count=0. Epic: CRDB-42943 Release note: None
1 parent c157bb6 commit d6e631f

File tree

2 files changed

+37
-13
lines changed

2 files changed

+37
-13
lines changed

pkg/sql/vecindex/cspann/commontest/storetests.go

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -346,14 +346,14 @@ func (suite *StoreTestSuite) TestSearchPartitions() {
346346
treeKey := store.MakeTreeKey(suite.T(), treeID)
347347

348348
// Create non-root partition with some vectors in it.
349-
testPartitionKey, _ := suite.createTestPartition(store, treeKey)
349+
testPartitionKey, testPartition := suite.createTestPartition(store, treeKey)
350350

351351
// Create another partition.
352352
testPartitionKey2 := cspann.PartitionKey(20)
353353
metadata := cspann.PartitionMetadata{
354354
Level: cspann.SecondLevel,
355355
Centroid: vector.T{2, 4},
356-
StateDetails: cspann.MakeReadyDetails(),
356+
StateDetails: cspann.MakeSplittingDetails(10, 20),
357357
}
358358
suite.NoError(store.TryCreateEmptyPartition(suite.ctx, treeKey, testPartitionKey2, metadata))
359359
vectors := vector.MakeSet(2)
@@ -368,20 +368,36 @@ func (suite *StoreTestSuite) TestSearchPartitions() {
368368

369369
suite.NoError(store.RunTransaction(suite.ctx, func(txn cspann.Txn) error {
370370
searchSet := cspann.SearchSet{MaxResults: 2}
371-
toSearch := []cspann.PartitionToSearch{{Key: testPartitionKey}, {Key: testPartitionKey2}}
371+
toSearch := []cspann.PartitionToSearch{
372+
{Key: testPartitionKey},
373+
{Key: cspann.PartitionKey(99)}, // Partition does not exist.
374+
{Key: testPartitionKey2},
375+
}
372376
err := txn.SearchPartitions(suite.ctx, treeKey, toSearch, vector.T{6, 1}, &searchSet)
373377
suite.NoError(err)
378+
379+
// Validate partition info.
380+
suite.Equal(cspann.SecondLevel, toSearch[0].Level)
381+
suite.Equal(testPartition.Metadata().StateDetails, toSearch[0].StateDetails)
382+
suite.Equal(3, toSearch[0].Count)
383+
384+
suite.Equal(cspann.InvalidLevel, toSearch[1].Level)
385+
suite.Equal(cspann.PartitionStateDetails{}, toSearch[1].StateDetails)
386+
suite.Equal(0, toSearch[1].Count)
387+
388+
suite.Equal(cspann.SecondLevel, toSearch[2].Level)
389+
suite.Equal(metadata.StateDetails, toSearch[2].StateDetails)
390+
suite.Equal(2, toSearch[2].Count)
391+
392+
// Validate search results.
374393
result1 := cspann.SearchResult{
375394
QuerySquaredDistance: 4.2, ErrorBound: 50.99, CentroidDistance: 7.21,
376395
ParentPartitionKey: testPartitionKey2, ChildKey: partitionKey4, ValueBytes: valueBytes4}
377396
result2 := cspann.SearchResult{
378397
QuerySquaredDistance: 8, ErrorBound: 0, CentroidDistance: 0,
379398
ParentPartitionKey: testPartitionKey, ChildKey: partitionKey3, ValueBytes: valueBytes3}
380399
suite.Equal(cspann.SearchResults{result1, result2}, RoundResults(searchSet.PopResults(), 2))
381-
suite.Equal(cspann.SecondLevel, toSearch[0].Level)
382-
suite.Equal(3, toSearch[0].Count)
383-
suite.Equal(cspann.SecondLevel, toSearch[1].Level)
384-
suite.Equal(2, toSearch[1].Count)
400+
385401
return nil
386402
}))
387403
}

pkg/sql/vecindex/vecstore/store_txn.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -270,13 +270,21 @@ func (tx *Txn) SearchPartitions(
270270
partition, err := tx.store.decodePartition(
271271
treeKey, toSearch[i].Key, &tx.codec, &b.Results[i*2], &b.Results[i*2+1])
272272
if err != nil {
273-
return err
273+
if errors.Is(err, cspann.ErrPartitionNotFound) {
274+
// Partition not found, so return InvalidLevel, MissingState, and
275+
// Count=0.
276+
toSearch[i].Level = cspann.InvalidLevel
277+
toSearch[i].StateDetails = cspann.PartitionStateDetails{}
278+
toSearch[i].Count = 0
279+
} else {
280+
return err
281+
}
282+
} else {
283+
toSearch[i].Level = partition.Level()
284+
toSearch[i].StateDetails = partition.Metadata().StateDetails
285+
toSearch[i].Count = partition.Search(
286+
&tx.codec.workspace, toSearch[i].Key, queryVector, searchSet)
274287
}
275-
276-
toSearch[i].Level = partition.Level()
277-
toSearch[i].StateDetails = partition.Metadata().StateDetails
278-
toSearch[i].Count = partition.Search(
279-
&tx.codec.workspace, toSearch[i].Key, queryVector, searchSet)
280288
}
281289

282290
return nil

0 commit comments

Comments
 (0)