From aa7e8abcb6453365a4069a4d5d37899e73196e4a Mon Sep 17 00:00:00 2001 From: Volodymyr Yavdoshenko Date: Mon, 28 Apr 2025 11:45:05 +0300 Subject: [PATCH] fix: RENAME in cluster mode crash (#4995) fixed: https://github.com/dragonflydb/dragonfly/issues/4993 --- src/server/generic_family.cc | 3 +++ src/server/search/search_family_test.cc | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/server/generic_family.cc b/src/server/generic_family.cc index 97c03eb96..fb7e9677b 100644 --- a/src/server/generic_family.cc +++ b/src/server/generic_family.cc @@ -870,6 +870,9 @@ OpResult OpRen(const OpArgs& op_args, string_view from_key, string_view to is_prior_list = (to_res.it->second.ObjType() == OBJ_LIST); } + // Delete the "from" document from the search index before deleting from the database + op_args.shard->search_indices()->RemoveDoc(from_key, op_args.db_cntx, from_res.it->second); + bool sticky = from_res.it->first.IsSticky(); uint64_t exp_ts = db_slice.ExpireTime(from_res.exp_it); diff --git a/src/server/search/search_family_test.cc b/src/server/search/search_family_test.cc index 82fbc3e71..00287c3c1 100644 --- a/src/server/search/search_family_test.cc +++ b/src/server/search/search_family_test.cc @@ -2722,4 +2722,23 @@ TEST_F(SearchFamilyTest, JsonWithNullFields) { AreDocIds("doc:1", "doc:2")); } +TEST_F(SearchFamilyTest, RenameDocumentBetweenIndices) { + absl::FlagSaver fs; + + SetTestFlag("cluster_mode", "emulated"); + ResetService(); + + EXPECT_EQ(Run({"ft.create", "idx1", "prefix", "1", "idx1", "filter", "@index==\"yes\"", "schema", + "t", "text"}), + "OK"); + EXPECT_EQ(Run({"ft.create", "idx2", "prefix", "1", "idx2", "filter", "@index==\"yes\"", "schema", + "t", "text"}), + "OK"); + + Run({"hset", "idx1:{doc}1", "t", "foo1", "index", "yes"}); + + EXPECT_EQ(Run({"rename", "idx1:{doc}1", "idx2:{doc}1"}), "OK"); + EXPECT_EQ(Run({"rename", "idx2:{doc}1", "idx1:{doc}1"}), "OK"); +} + } // namespace dfly