From 49781e8daff373cae6398ffa4d867be46441ee65 Mon Sep 17 00:00:00 2001 From: Roman Gershman Date: Fri, 8 Apr 2022 06:53:22 +0300 Subject: [PATCH] Some bug fixes. closes #19 and closes #20. --- src/server/dragonfly_test.cc | 10 ++++++++++ src/server/main_service.cc | 4 +++- src/server/transaction.cc | 1 - 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/server/dragonfly_test.cc b/src/server/dragonfly_test.cc index 2d9cbff8b..622a782cc 100644 --- a/src/server/dragonfly_test.cc +++ b/src/server/dragonfly_test.cc @@ -114,6 +114,10 @@ TEST_F(DflyEngineTest, MultiEmpty) { ASSERT_THAT(resp[0], ArrLen(0)); ASSERT_FALSE(service_->IsShardSetLocked()); + + Run({"multi"}); + ASSERT_THAT(Run({"ping", "foo"}), RespEq("QUEUED")); + EXPECT_THAT(Run({"exec"}), ElementsAre("foo")); } TEST_F(DflyEngineTest, MultiSeq) { @@ -178,6 +182,12 @@ TEST_F(DflyEngineTest, MultiConsistent) { ASSERT_FALSE(service_->IsShardSetLocked()); } +TEST_F(DflyEngineTest, MultiWeirdCommands) { + Run({"multi"}); + ASSERT_THAT(Run({"eval", "return 42", "0"}), RespEq("QUEUED")); + EXPECT_THAT(Run({"exec"}), ElementsAre(IntArg(42))); +} + TEST_F(DflyEngineTest, MultiRename) { RespVec resp = Run({"multi"}); ASSERT_THAT(resp, RespEq("OK")); diff --git a/src/server/main_service.cc b/src/server/main_service.cc index 2824ee665..5ff280a51 100644 --- a/src/server/main_service.cc +++ b/src/server/main_service.cc @@ -853,7 +853,9 @@ void Service::Exec(CmdArgList args, ConnectionContext* cntx) { cntx->transaction->SetExecCmd(scmd.descr); CmdArgList cmd_arg_list{str_list.data(), str_list.size()}; - cntx->transaction->InitByArgs(cntx->conn_state.db_index, cmd_arg_list); + if (IsTransactional(scmd.descr)) { + cntx->transaction->InitByArgs(cntx->conn_state.db_index, cmd_arg_list); + } scmd.descr->Invoke(cmd_arg_list, cntx); if (rb->GetError()) break; diff --git a/src/server/transaction.cc b/src/server/transaction.cc index e4d268442..bcefb0110 100644 --- a/src/server/transaction.cc +++ b/src/server/transaction.cc @@ -975,7 +975,6 @@ bool Transaction::CancelInShard(EngineShard* shard) { // runs in engine-shard thread. ArgSlice Transaction::ShardArgsInShard(ShardId sid) const { DCHECK(!args_.empty()); - DCHECK_NOTNULL(EngineShard::tlocal()); // We can read unique_shard_cnt_ only because ShardArgsInShard is called after IsArmedInShard // barrier.