From 8bd124874043725b71445d2992939745ef378ccb Mon Sep 17 00:00:00 2001 From: taoshuning <616811991@qq.com> Date: Wed, 26 Jul 2023 13:12:22 +0000 Subject: [PATCH] Add defensive for log restore mysql provider access concurrency control --- src/share/ob_log_restore_proxy.cpp | 13 ++++++++++--- src/share/ob_log_restore_proxy.h | 6 ++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/share/ob_log_restore_proxy.cpp b/src/share/ob_log_restore_proxy.cpp index d4b7e56c5b..1db1f94e30 100644 --- a/src/share/ob_log_restore_proxy.cpp +++ b/src/share/ob_log_restore_proxy.cpp @@ -65,11 +65,11 @@ namespace share } while (OB_FAIL(ret) && retry_time++ < server_prover_.get_server_count() - 1); -ObLogRestoreMySQLProvider::ObLogRestoreMySQLProvider() : server_list_() {} +ObLogRestoreMySQLProvider::ObLogRestoreMySQLProvider() : server_list_(), lock_() {} ObLogRestoreMySQLProvider::~ObLogRestoreMySQLProvider() { - server_list_.reset(); + destroy(); } int ObLogRestoreMySQLProvider::init(const common::ObIArray &server_list) @@ -80,6 +80,7 @@ int ObLogRestoreMySQLProvider::init(const common::ObIArray &serv int ObLogRestoreMySQLProvider::set_restore_source_server(const common::ObIArray &server_list) { int ret = OB_SUCCESS; + WLockGuard guard(lock_); if (OB_UNLIKELY(server_list.count() <= 0)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid argument", K(server_list)); @@ -90,15 +91,20 @@ int ObLogRestoreMySQLProvider::set_restore_source_server(const common::ObIArray< } void ObLogRestoreMySQLProvider::destroy() { + WLockGuard guard(lock_); server_list_.reset(); } int ObLogRestoreMySQLProvider::get_server(const int64_t svr_idx, common::ObAddr &server) { + RLockGuard guard(lock_); int ret = OB_SUCCESS; - if (OB_UNLIKELY(svr_idx < 0 || svr_idx >= server_list_.count())) { + if (OB_UNLIKELY(svr_idx < 0)) { ret = OB_INVALID_INDEX; LOG_WARN("get_server invalid index", K(svr_idx)); + } else if (OB_UNLIKELY(svr_idx >= server_list_.count())) { + ret = OB_ENTRY_NOT_EXIST; + LOG_WARN("svr_idx out of range", K(svr_idx), K(server_list_)); } else { server = server_list_.at(svr_idx); } @@ -107,6 +113,7 @@ int ObLogRestoreMySQLProvider::get_server(const int64_t svr_idx, common::ObAddr int64_t ObLogRestoreMySQLProvider::get_server_count() const { + RLockGuard guard(lock_); return server_list_.count(); } diff --git a/src/share/ob_log_restore_proxy.h b/src/share/ob_log_restore_proxy.h index 7b345aa641..5017a04283 100644 --- a/src/share/ob_log_restore_proxy.h +++ b/src/share/ob_log_restore_proxy.h @@ -49,8 +49,14 @@ public: int prepare_refresh() override; int end_refresh() override; +private: + typedef common::SpinRWLock RWLock; + typedef common::SpinRLockGuard RLockGuard; + typedef common::SpinWLockGuard WLockGuard; + private: common::ObArray server_list_; + mutable RWLock lock_; private: DISALLOW_COPY_AND_ASSIGN(ObLogRestoreMySQLProvider);