From e273f7a2b86691e756b2cf4ddcd42498ca741509 Mon Sep 17 00:00:00 2001 From: Vladislav Date: Tue, 12 Dec 2023 19:34:02 +0300 Subject: [PATCH] fix(server): handle no-key-transactional commands in multi/exec (#2279) Signed-off-by: Vladislav Oleshko --- src/server/main_service.cc | 6 ++++++ src/server/multi_test.cc | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/server/main_service.cc b/src/server/main_service.cc index 3a293cd8c..aa560c613 100644 --- a/src/server/main_service.cc +++ b/src/server/main_service.cc @@ -678,6 +678,12 @@ optional DeduceExecMode(ExecEvalState state, for (const auto& scmd : exec_info.body) { transactional |= scmd.Cid()->IsTransactional(); contains_global |= scmd.Cid()->opt_mask() & CO::GLOBAL_TRANS; + + // We can't run no-key-transactional commands in lock-ahead mode currently, + // because it means we have to schedule on all shards + if (scmd.Cid()->opt_mask() & CO::NO_KEY_TRANSACTIONAL) + contains_global = true; + if (contains_global) break; } diff --git a/src/server/multi_test.cc b/src/server/multi_test.cc index f1591bf95..2785db559 100644 --- a/src/server/multi_test.cc +++ b/src/server/multi_test.cc @@ -920,6 +920,12 @@ TEST_F(MultiTest, EvalExpiration) { EXPECT_LE(CheckedInt({"pttl", "x"}), 5000); } +TEST_F(MultiTest, NoKeyTransactional) { + Run({"multi"}); + Run({"ft._list"}); + Run({"exec"}); +} + class MultiEvalTest : public BaseFamilyTest { protected: MultiEvalTest() : BaseFamilyTest() {