From ea1a54b58ba2651c8e6d3c9408bb19fb93718283 Mon Sep 17 00:00:00 2001 From: tedli Date: Wed, 31 Jan 2024 21:30:01 +0800 Subject: [PATCH] feat:check repl state to response immediately if full sync not finished (#2197) * check repl state to response immediately if full sync not finished Signed-off-by: lizhen --- include/pika_command.h | 3 +++ src/cache/CMakeLists.txt | 2 +- src/pika_client_conn.cc | 18 ++++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/include/pika_command.h b/include/pika_command.h index 4b52eda9e5..3d5d535971 100644 --- a/include/pika_command.h +++ b/include/pika_command.h @@ -474,8 +474,11 @@ struct UnblockTaskArgs { : key(std::move(key_)), db(db_), dispatchThread(dispatchThread_) {} }; +class PikaClientConn; + class Cmd : public std::enable_shared_from_this { public: + friend class PikaClientConn; enum CmdStage { kNone, kBinlogStage, kExecuteStage }; struct HintKeys { HintKeys() = default; diff --git a/src/cache/CMakeLists.txt b/src/cache/CMakeLists.txt index 9c373ccf5e..e61b2eacdc 100644 --- a/src/cache/CMakeLists.txt +++ b/src/cache/CMakeLists.txt @@ -6,7 +6,7 @@ project (cache) aux_source_directory(./src DIR_SRCS) include_directories(include) add_library(cache STATIC ${DIR_SRCS}) -add_dependencies(cache net protobuf glog gflags ${LIBUNWIND_NAME}) +add_dependencies(cache net protobuf glog gflags rediscache ${LIBUNWIND_NAME}) target_link_libraries(cache PUBLIC ${GTEST_LIBRARY} diff --git a/src/pika_client_conn.cc b/src/pika_client_conn.cc index 2099281006..ea5244067e 100644 --- a/src/pika_client_conn.cc +++ b/src/pika_client_conn.cc @@ -16,6 +16,7 @@ #include "include/pika_cmd_table_manager.h" #include "include/pika_command.h" #include "include/pika_conf.h" +#include "include/pika_define.h" #include "include/pika_rm.h" #include "include/pika_server.h" #include "net/src/dispatch_thread.h" @@ -164,6 +165,23 @@ std::shared_ptr PikaClientConn::DoCmd(const PikaCmdArgsType& argv, const st c_ptr->res().SetRes(CmdRes::kErrOther, "Server in read-only"); return c_ptr; } + } else if (c_ptr->is_read() && c_ptr->flag_ == 0) { + const auto& server_guard = std::lock_guard(g_pika_server->GetDBLock()); + int role = 0; + auto status = g_pika_rm->CheckDBRole(current_db_, &role); + if (!status.ok()) { + c_ptr->res().SetRes(CmdRes::kErrOther, "Internal ERROR"); + return c_ptr; + } else if ((role & PIKA_ROLE_SLAVE) == PIKA_ROLE_SLAVE) { + const auto& slave_db = g_pika_rm->GetSyncSlaveDBByName(DBInfo(current_db_)); + if (!slave_db) { + c_ptr->res().SetRes(CmdRes::kErrOther, "Internal ERROR"); + return c_ptr; + } else if (slave_db->State() != ReplState::kConnected) { + c_ptr->res().SetRes(CmdRes::kErrOther, "Full sync not completed"); + return c_ptr; + } + } } // Process Command