From 1d6975a8eaaf730feb1598e403e32724e157ac82 Mon Sep 17 00:00:00 2001 From: zqq Date: Thu, 27 Jan 2022 10:01:33 +0800 Subject: [PATCH] 1.fixbug: statemachine do timeout in next sync task when last sync task timeout 2.fixbug: merge sync task will modify context state finished it will cause stateMachine do different task at the sametime Signed-off-by: zqq --- .../syncer/src/multi_ver_sync_state_machine.cpp | 6 +++++- .../distributeddb/syncer/src/multi_ver_sync_state_machine.h | 2 +- .../syncer/src/single_ver_sync_state_machine.cpp | 6 +++++- .../syncer/src/single_ver_sync_state_machine.h | 2 +- .../libs/distributeddb/syncer/src/sync_state_machine.cpp | 3 +-- .../libs/distributeddb/syncer/src/sync_state_machine.h | 2 +- 6 files changed, 14 insertions(+), 7 deletions(-) diff --git a/services/distributeddataservice/libs/distributeddb/syncer/src/multi_ver_sync_state_machine.cpp b/services/distributeddataservice/libs/distributeddb/syncer/src/multi_ver_sync_state_machine.cpp index e2bc23b14..7a0ec21ce 100755 --- a/services/distributeddataservice/libs/distributeddb/syncer/src/multi_ver_sync_state_machine.cpp +++ b/services/distributeddataservice/libs/distributeddb/syncer/src/multi_ver_sync_state_machine.cpp @@ -168,10 +168,14 @@ int MultiVerSyncStateMachine::ReceiveMessageCallback(Message *inMsg) return errCode; } -void MultiVerSyncStateMachine::StepToTimeout() +void MultiVerSyncStateMachine::StepToTimeout(TimerId timerId) { { std::lock_guard lock(stateMachineLock_); + TimerId timer = syncContext_->GetTimerId(); + if (timer != timerId) { + return; + } currentState_ = SYNC_TIME_OUT; } Abort(); diff --git a/services/distributeddataservice/libs/distributeddb/syncer/src/multi_ver_sync_state_machine.h b/services/distributeddataservice/libs/distributeddb/syncer/src/multi_ver_sync_state_machine.h index b4c6689f3..ea02f5d4e 100755 --- a/services/distributeddataservice/libs/distributeddb/syncer/src/multi_ver_sync_state_machine.h +++ b/services/distributeddataservice/libs/distributeddb/syncer/src/multi_ver_sync_state_machine.h @@ -56,7 +56,7 @@ protected: void SyncStep() override; // SyncOperation is timeout, step to timeout state - void StepToTimeout() override; + void StepToTimeout(TimerId timerId) override; void SyncStepInnerLocked() override; diff --git a/services/distributeddataservice/libs/distributeddb/syncer/src/single_ver_sync_state_machine.cpp b/services/distributeddataservice/libs/distributeddb/syncer/src/single_ver_sync_state_machine.cpp index a59713da0..1de9493fa 100755 --- a/services/distributeddataservice/libs/distributeddb/syncer/src/single_ver_sync_state_machine.cpp +++ b/services/distributeddataservice/libs/distributeddb/syncer/src/single_ver_sync_state_machine.cpp @@ -814,9 +814,13 @@ int SingleVerSyncStateMachine::ControlPktRecv(Message *inMsg) return errCode; } -void SingleVerSyncStateMachine::StepToTimeout() +void SingleVerSyncStateMachine::StepToTimeout(TimerId timerId) { std::lock_guard lock(stateMachineLock_); + TimerId timer = syncContext_->GetTimerId(); + if (timer != timerId) { + return; + } SwitchStateAndStep(Event::TIME_OUT_EVENT); } diff --git a/services/distributeddataservice/libs/distributeddb/syncer/src/single_ver_sync_state_machine.h b/services/distributeddataservice/libs/distributeddb/syncer/src/single_ver_sync_state_machine.h index 965c13eeb..587ec04a2 100755 --- a/services/distributeddataservice/libs/distributeddb/syncer/src/single_ver_sync_state_machine.h +++ b/services/distributeddataservice/libs/distributeddb/syncer/src/single_ver_sync_state_machine.h @@ -105,7 +105,7 @@ protected: void SyncStep() override; // SyncOperation is timeout, step to timeout state - void StepToTimeout() override; + void StepToTimeout(TimerId timerId) override; void SyncStepInnerLocked() override; diff --git a/services/distributeddataservice/libs/distributeddb/syncer/src/sync_state_machine.cpp b/services/distributeddataservice/libs/distributeddb/syncer/src/sync_state_machine.cpp index d07877666..53d7bb83c 100755 --- a/services/distributeddataservice/libs/distributeddb/syncer/src/sync_state_machine.cpp +++ b/services/distributeddataservice/libs/distributeddb/syncer/src/sync_state_machine.cpp @@ -87,7 +87,7 @@ int SyncStateMachine::TimeoutCallback(TimerId timerId) if (retryTime >= syncContext_->GetSyncRetryTimes() || !syncContext_->IsSyncTaskNeedRetry()) { LOGI("[SyncStateMachine][Timeout] TimeoutCallback retryTime:%d", retryTime); syncContext_->UnlockObj(); - StepToTimeout(); + StepToTimeout(timerId); syncContext_->LockObj(); return E_OK; } @@ -169,7 +169,6 @@ int SyncStateMachine::ExecNextTask() syncContext_->MoveToNextTarget(); if (syncContext_->IsCurrentSyncTaskCanBeSkipped()) { syncContext_->SetOperationStatus(SyncOperation::OP_FINISHED_ALL); - syncContext_->SetTaskExecStatus(ISyncTaskContext::FINISHED); continue; } int errCode = PrepareNextSyncTask(); diff --git a/services/distributeddataservice/libs/distributeddb/syncer/src/sync_state_machine.h b/services/distributeddataservice/libs/distributeddb/syncer/src/sync_state_machine.h index da86fceb8..cf493e9e5 100755 --- a/services/distributeddataservice/libs/distributeddb/syncer/src/sync_state_machine.h +++ b/services/distributeddataservice/libs/distributeddb/syncer/src/sync_state_machine.h @@ -68,7 +68,7 @@ public: protected: // SyncOperation is timeout, step to timeout state - virtual void StepToTimeout() = 0; + virtual void StepToTimeout(TimerId timerId) = 0; // Step the SingleVerSyncStateMachine virtual void SyncStep() = 0; -- Gitee