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() {