From 282c168d34b5bd7568a7d0edc05f835a5f6f5eac Mon Sep 17 00:00:00 2001 From: Vladislav Date: Wed, 12 Apr 2023 23:28:31 +0300 Subject: [PATCH] fix: Update cntx->cid on multi-tx'es (#1081) Signed-off-by: Vladislav Oleshko --- src/server/main_service.cc | 1 + src/server/multi_command_squasher.cc | 3 +++ src/server/transaction.cc | 2 ++ tests/dragonfly/replication_test.py | 5 +++-- 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/server/main_service.cc b/src/server/main_service.cc index 80a431990..77c214959 100644 --- a/src/server/main_service.cc +++ b/src/server/main_service.cc @@ -1395,6 +1395,7 @@ void Service::Exec(CmdArgList args, ConnectionContext* cntx) { for (auto& scmd : exec_info.body) { cntx->transaction->MultiSwitchCmd(scmd.Cid()); + cntx->cid = scmd.Cid(); arg_vec.resize(scmd.NumArgs()); CmdArgList args = absl::MakeSpan(arg_vec); diff --git a/src/server/multi_command_squasher.cc b/src/server/multi_command_squasher.cc index 1af6299dc..3dbc04101 100644 --- a/src/server/multi_command_squasher.cc +++ b/src/server/multi_command_squasher.cc @@ -94,6 +94,7 @@ void MultiCommandSquasher::ExecuteStandalone(StoredCmd* cmd) { auto* tx = cntx_->transaction; tx->MultiSwitchCmd(cmd->Cid()); + cntx_->cid = cmd->Cid(); tmp_keylist_.resize(cmd->NumArgs()); auto args = absl::MakeSpan(tmp_keylist_); @@ -116,6 +117,7 @@ OpStatus MultiCommandSquasher::SquashedHopCb(Transaction* parent_tx, EngineShard for (auto* cmd : sinfo.cmds) { local_tx->MultiSwitchCmd(cmd->Cid()); + local_cntx.cid = cmd->Cid(); arg_vec.resize(cmd->NumArgs()); auto args = absl::MakeSpan(arg_vec); @@ -149,6 +151,7 @@ void MultiCommandSquasher::ExecuteSquashed() { tx->PrepareSquashedMultiHop(base_cid_, cb); } + cntx_->cid = base_cid_; tx->ScheduleSingleHop([this](auto* tx, auto* es) { return SquashedHopCb(tx, es); }); facade::CapturingReplyBuilder::Payload payload; diff --git a/src/server/transaction.cc b/src/server/transaction.cc index 2b0cea9ec..f1bbcabb3 100644 --- a/src/server/transaction.cc +++ b/src/server/transaction.cc @@ -57,6 +57,8 @@ Transaction::Transaction(const Transaction* parent) : multi_{make_unique()}, txid_{parent->txid()} { multi_->mode = parent->multi_->mode; multi_->role = SQUASHED_STUB; + + time_now_ms_ = parent->time_now_ms_; } Transaction::~Transaction() { diff --git a/tests/dragonfly/replication_test.py b/tests/dragonfly/replication_test.py index 2b7f8e96a..2943c24cc 100644 --- a/tests/dragonfly/replication_test.py +++ b/tests/dragonfly/replication_test.py @@ -640,7 +640,7 @@ async def test_expiry(df_local_factory, n_keys=1000): res = await c_replica.mget(k for k, _ in gen_test_data(n_keys)) assert all(v is not None for v in res) - # Set key differnt expries times in ms + # Set key different expries times in ms pipe = c_master.pipeline(transaction=True) for k, _ in gen_test_data(n_keys): ms = random.randint(20, 500) @@ -663,9 +663,10 @@ async def test_expiry(df_local_factory, n_keys=1000): # Wait for master to expire keys await asyncio.sleep(3.0) - # Check all keys with expiry has be deleted + # Check all keys with expiry have been deleted res = await c_master.mget(k for k, _ in gen_test_data(n_keys)) assert all(v is None for v in res) + # Check replica finished executing the replicated commands await check_all_replicas_finished([c_replica], c_master) res = await c_replica.mget(k for k, _ in gen_test_data(n_keys))