From f467e75be62f902eacb2f2b01e5e31261615fab8 Mon Sep 17 00:00:00 2001 From: Chengyu Liu Date: Wed, 6 Mar 2024 17:23:16 +0800 Subject: [PATCH] fix: after full synchronization fails, full synchronization will be skipped directly(#2433) (#2439) Co-authored-by: liuchengyu --- include/pika_rm.h | 2 +- src/pika_rm.cc | 15 ++++++++++++--- src/rsync_client.cc | 1 + 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/include/pika_rm.h b/include/pika_rm.h index b9379466de..89306a8a0c 100644 --- a/include/pika_rm.h +++ b/include/pika_rm.h @@ -115,7 +115,7 @@ class SyncSlaveDB : public SyncDB { void SetMasterSessionId(int32_t session_id); void SetLocalIp(const std::string& local_ip); void StopRsync(); - void ActivateRsync(); + pstd::Status ActivateRsync(); bool IsRsyncRunning() {return rsync_cli_->IsRunning();} private: diff --git a/src/pika_rm.cc b/src/pika_rm.cc index e1deb6d8c8..67757272f6 100644 --- a/src/pika_rm.cc +++ b/src/pika_rm.cc @@ -502,15 +502,18 @@ void SyncSlaveDB::StopRsync() { rsync_cli_->Stop(); } -void SyncSlaveDB::ActivateRsync() { +pstd::Status SyncSlaveDB::ActivateRsync() { + Status s = Status::OK(); if (!rsync_cli_->IsIdle()) { - return; + return s; } LOG(WARNING) << "ActivateRsync ..."; if (rsync_cli_->Init()) { rsync_cli_->Start(); + return s; } else { SetReplState(ReplState::kError); + return Status::Error("rsync client init failed!");; } } @@ -960,7 +963,13 @@ Status PikaReplicaManager::RunSyncSlaveDBStateMachine() { } else if (s_db->State() == ReplState::kWaitReply) { continue; } else if (s_db->State() == ReplState::kWaitDBSync) { - s_db->ActivateRsync(); + Status s = s_db->ActivateRsync(); + if (!s.ok()) { + g_pika_server->SetForceFullSync(true); + LOG(WARNING) << "Slave DB: " << s_db->DBName() << " rsync failed! full synchronization will be retried later"; + continue; + } + std::shared_ptr db = g_pika_server->GetDB(p_info.db_name_); if (db) { diff --git a/src/rsync_client.cc b/src/rsync_client.cc index f65314c6ea..0bdbde2223 100644 --- a/src/rsync_client.cc +++ b/src/rsync_client.cc @@ -66,6 +66,7 @@ bool RsyncClient::Init() { if (!ret) { LOG(WARNING) << "RsyncClient recover failed"; client_thread_->StopThread(); + state_.store(IDLE); return false; } finished_work_cnt_.store(0);