From 1e05c2442ff1b96fa660daccf1eded1dfeced329 Mon Sep 17 00:00:00 2001 From: Volodymyr Yavdoshenko Date: Tue, 22 Apr 2025 18:12:41 +0300 Subject: [PATCH 1/4] fix: test was added --- src/server/search/search_family_test.cc | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/server/search/search_family_test.cc b/src/server/search/search_family_test.cc index 82fbc3e71012..4929ba780666 100644 --- a/src/server/search/search_family_test.cc +++ b/src/server/search/search_family_test.cc @@ -2722,4 +2722,21 @@ TEST_F(SearchFamilyTest, JsonWithNullFields) { AreDocIds("doc:1", "doc:2")); } +TEST_F(SearchFamilyTest, TestVectorIndexPtrValidity) { + const uint32_t MY_UINT16_MAX = 65535; + const uint32_t M = MY_UINT16_MAX + 1; + const uint32_t dim = 4; + + EXPECT_EQ( + Run({"FT.CREATE", "idx", "SCHEMA", "n", "NUMERIC", "v", "VECTOR", "HNSW", "8", "TYPE", + "FLOAT16", "DIM", absl::StrCat(dim), "DISTANCE_METRIC", "L2", "M", absl::StrCat(M)}), + "OK"); + + auto res = Run({"HSET", "doc", "n", "0"}); + EXPECT_EQ(res, "1"); + + res = Run({"HSET", "doc", "n", "1"}); + EXPECT_EQ(res, "0"); +} + } // namespace dfly From 322d8a4d8ad05b25161f7c3ae90f411eb5d2a3f0 Mon Sep 17 00:00:00 2001 From: Volodymyr Yavdoshenko Date: Wed, 23 Apr 2025 17:21:56 +0300 Subject: [PATCH 2/4] fix: crash was fixed --- src/server/search/doc_index.cc | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/server/search/doc_index.cc b/src/server/search/doc_index.cc index e2975bab687e..b8aa7fce2b38 100644 --- a/src/server/search/doc_index.cc +++ b/src/server/search/doc_index.cc @@ -322,10 +322,14 @@ void ShardDocIndex::RemoveDoc(string_view key, const DbContext& db_cntx, const P if (!indices_) return; - auto accessor = GetAccessor(db_cntx, pv); - auto id = key_index_.Remove(key); - if (id) { - indices_->Remove(id.value(), *accessor); + try { + auto accessor = GetAccessor(db_cntx, pv); + auto id = key_index_.Remove(key); + if (id) { + indices_->Remove(id.value(), *accessor); + } + } catch (const std::exception& e) { + LOG(WARNING) << "Exception while removing document " << key << ": " << e.what(); } } From 0ba68b9cae1ed8bc541b866b790096d720f004cb Mon Sep 17 00:00:00 2001 From: Volodymyr Yavdoshenko Date: Wed, 23 Apr 2025 17:36:24 +0300 Subject: [PATCH 3/4] fix: test cleanup --- src/server/search/search_family_test.cc | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/server/search/search_family_test.cc b/src/server/search/search_family_test.cc index 4929ba780666..5c04c75af710 100644 --- a/src/server/search/search_family_test.cc +++ b/src/server/search/search_family_test.cc @@ -2722,21 +2722,16 @@ TEST_F(SearchFamilyTest, JsonWithNullFields) { AreDocIds("doc:1", "doc:2")); } -TEST_F(SearchFamilyTest, TestVectorIndexPtrValidity) { - const uint32_t MY_UINT16_MAX = 65535; - const uint32_t M = MY_UINT16_MAX + 1; - const uint32_t dim = 4; - - EXPECT_EQ( - Run({"FT.CREATE", "idx", "SCHEMA", "n", "NUMERIC", "v", "VECTOR", "HNSW", "8", "TYPE", - "FLOAT16", "DIM", absl::StrCat(dim), "DISTANCE_METRIC", "L2", "M", absl::StrCat(M)}), - "OK"); +TEST_F(SearchFamilyTest, TestTwoHsetDocumentCreationCrashes) { + EXPECT_EQ(Run({"FT.CREATE", "idx", "SCHEMA", "n", "NUMERIC", "v", "VECTOR", "HNSW", "8", "TYPE", + "FLOAT16", "DIM", "4", "DISTANCE_METRIC", "L2", "M", "65536"}), + "OK"); auto res = Run({"HSET", "doc", "n", "0"}); - EXPECT_EQ(res, "1"); + EXPECT_EQ(res, 1); res = Run({"HSET", "doc", "n", "1"}); - EXPECT_EQ(res, "0"); + EXPECT_EQ(res, 0); } } // namespace dfly From 2f2fc92a0d0889411c46c246c00bc1e14c7f8cf9 Mon Sep 17 00:00:00 2001 From: Volodymyr Yavdoshenko Date: Wed, 23 Apr 2025 18:50:55 +0300 Subject: [PATCH 4/4] fix: review fixed --- src/core/search/indices.cc | 5 ++++- src/server/search/doc_index.cc | 12 ++++-------- src/server/search/search_family_test.cc | 6 +++--- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/core/search/indices.cc b/src/core/search/indices.cc index 9d77f1a1b5f9..9f739b05cf65 100644 --- a/src/core/search/indices.cc +++ b/src/core/search/indices.cc @@ -281,7 +281,10 @@ struct HnswlibAdapter { } void Remove(DocId id) { - world_.markDelete(id); + try { + world_.markDelete(id); + } catch (const std::exception& e) { + } } vector> Knn(float* target, size_t k, std::optional ef) { diff --git a/src/server/search/doc_index.cc b/src/server/search/doc_index.cc index b8aa7fce2b38..e2975bab687e 100644 --- a/src/server/search/doc_index.cc +++ b/src/server/search/doc_index.cc @@ -322,14 +322,10 @@ void ShardDocIndex::RemoveDoc(string_view key, const DbContext& db_cntx, const P if (!indices_) return; - try { - auto accessor = GetAccessor(db_cntx, pv); - auto id = key_index_.Remove(key); - if (id) { - indices_->Remove(id.value(), *accessor); - } - } catch (const std::exception& e) { - LOG(WARNING) << "Exception while removing document " << key << ": " << e.what(); + auto accessor = GetAccessor(db_cntx, pv); + auto id = key_index_.Remove(key); + if (id) { + indices_->Remove(id.value(), *accessor); } } diff --git a/src/server/search/search_family_test.cc b/src/server/search/search_family_test.cc index 5c04c75af710..d6dcd5254893 100644 --- a/src/server/search/search_family_test.cc +++ b/src/server/search/search_family_test.cc @@ -2722,7 +2722,7 @@ TEST_F(SearchFamilyTest, JsonWithNullFields) { AreDocIds("doc:1", "doc:2")); } -TEST_F(SearchFamilyTest, TestTwoHsetDocumentCreationCrashes) { +TEST_F(SearchFamilyTest, TestHsetDeleteDocumentHnswSchemaCrash) { EXPECT_EQ(Run({"FT.CREATE", "idx", "SCHEMA", "n", "NUMERIC", "v", "VECTOR", "HNSW", "8", "TYPE", "FLOAT16", "DIM", "4", "DISTANCE_METRIC", "L2", "M", "65536"}), "OK"); @@ -2730,8 +2730,8 @@ TEST_F(SearchFamilyTest, TestTwoHsetDocumentCreationCrashes) { auto res = Run({"HSET", "doc", "n", "0"}); EXPECT_EQ(res, 1); - res = Run({"HSET", "doc", "n", "1"}); - EXPECT_EQ(res, 0); + res = Run({"DEL", "doc"}); + EXPECT_EQ(res, 1); } } // namespace dfly