From edb71c1b03d2c43abf06f9b969a16cc6510b0515 Mon Sep 17 00:00:00 2001 From: KernelMaker Date: Sat, 1 Apr 2017 16:23:25 +0800 Subject: [PATCH] bugfix: A <- B <- C, when C executesslaveof no one, B should change its status from (MASTER/SLAVE) to (SLAVE) --- src/pika_server.cc | 18 +++++++++++++++++- tools/ssdb_to_pika/ssdb_to_pika.cc | 5 ++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/pika_server.cc b/src/pika_server.cc index c8b3f7de..a54ddc58 100644 --- a/src/pika_server.cc +++ b/src/pika_server.cc @@ -297,6 +297,8 @@ void PikaServer::Start() { void PikaServer::DeleteSlave(const std::string& ip, int64_t port) { std::string ip_port = slash::IpPortString(ip, port); + int slave_num = 0; + { slash::MutexLock l(&slave_mutex_); std::vector::iterator iter = slaves_.begin(); while (iter != slaves_.end()) { @@ -312,10 +314,18 @@ void PikaServer::DeleteSlave(const std::string& ip, int64_t port) { delete static_cast(iter->sender); } slaves_.erase(iter); - return; + slave_num = slaves_.size(); + } + + slash::RWLock l(&state_protector_, true); + if (slave_num == 0) { + role_ &= ~PIKA_ROLE_MASTER; + } } void PikaServer::DeleteSlave(int fd) { + int slave_num = 0; + { slash::MutexLock l(&slave_mutex_); std::vector::iterator iter = slaves_.begin(); @@ -330,6 +340,12 @@ void PikaServer::DeleteSlave(int fd) { } iter++; } + slave_num = slaves_.size(); + } + slash::RWLock l(&state_protector_, true); + if (slave_num == 0) { + role_ &= ~PIKA_ROLE_MASTER; + } } /* diff --git a/tools/ssdb_to_pika/ssdb_to_pika.cc b/tools/ssdb_to_pika/ssdb_to_pika.cc index 3d25ac52..70baf08f 100644 --- a/tools/ssdb_to_pika/ssdb_to_pika.cc +++ b/tools/ssdb_to_pika/ssdb_to_pika.cc @@ -51,7 +51,7 @@ void MigrateKv(const std::string& ip, const int port, } prev_start = kvs[kvs.size() - 2]; } - + delete client; std::cout << std::this_thread::get_id() << ", Kv client done" << std::endl; } @@ -105,6 +105,7 @@ void MigrateHash(const std::string& ip, const int port, prev_start_field = fvs[fvs.size() - 2]; } } + delete client; std::cout << std::this_thread::get_id() << ", Hash client done" << std::endl; } @@ -158,6 +159,7 @@ void MigrateQueue(const std::string& ip, const int port, start += fs.size(); } } + delete client; std::cout << std::this_thread::get_id() << ", Queue client done" << std::endl; } @@ -211,6 +213,7 @@ void MigrateZset(const std::string& ip, const int port, prev_start_member = sms[sms.size() - 2]; } } + delete client; std::cout << std::this_thread::get_id() << ", Zset client done" << std::endl; } -- GitLab