From e69f44135bb83608115315115747d7d452ba1697 Mon Sep 17 00:00:00 2001 From: obdev Date: Mon, 18 Mar 2024 06:55:12 +0000 Subject: [PATCH] Repair rebuild wakeup logic --- .../high_availability/ob_rebuild_service.cpp | 31 +++++++++++++++++-- .../high_availability/ob_rebuild_service.h | 3 ++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/storage/high_availability/ob_rebuild_service.cpp b/src/storage/high_availability/ob_rebuild_service.cpp index 82f387dac6..d3d2a82914 100644 --- a/src/storage/high_availability/ob_rebuild_service.cpp +++ b/src/storage/high_availability/ob_rebuild_service.cpp @@ -170,7 +170,8 @@ ObRebuildService::ObRebuildService() wakeup_cnt_(0), ls_service_(nullptr), map_lock_(), - rebuild_ctx_map_() + rebuild_ctx_map_(), + fast_sleep_cnt_(0) { } @@ -365,6 +366,12 @@ void ObRebuildService::wakeup() thread_cond_.signal(); } +void ObRebuildService::fast_sleep() +{ + ObThreadCondGuard guard(thread_cond_); + fast_sleep_cnt_++; +} + void ObRebuildService::destroy() { if (is_inited_) { @@ -372,6 +379,7 @@ void ObRebuildService::destroy() thread_cond_.destroy(); wakeup_cnt_ = 0; rebuild_ctx_map_.destroy(); + fast_sleep_cnt_ = 0; is_inited_ = false; COMMON_LOG(INFO, "ObRebuildService destroyed"); } @@ -436,10 +444,11 @@ void ObRebuildService::run1() wakeup_cnt_ = 0; } else { int64_t wait_time_ms = SCHEDULER_WAIT_TIME_MS; - if (OB_SERVER_IS_INIT == ret) { + if (OB_SERVER_IS_INIT == ret || fast_sleep_cnt_ > 0) { wait_time_ms = WAIT_SERVER_IN_SERVICE_TIME_MS; } thread_cond_.wait(wait_time_ms); + fast_sleep_cnt_ = 0; } } } @@ -1021,7 +1030,11 @@ int ObLSRebuildMgr::switch_next_status_( } else { FLOG_INFO("update rebuild info", K(curr_rebuild_info), K(next_rebuild_info)); } - wakeup_(); + if (OB_SUCCESS == result && OB_SUCC(ret)) { + wakeup_(); + } else { + fast_sleep_(); + } } return ret; } @@ -1038,6 +1051,18 @@ void ObLSRebuildMgr::wakeup_() } } +void ObLSRebuildMgr::fast_sleep_() +{ + int ret = OB_SUCCESS; + ObRebuildService *rebuild_service = MTL(ObRebuildService*); + if (OB_ISNULL(rebuild_service)) { + ret = OB_ERR_UNEXPECTED; + LOG_ERROR("storage ha handler service should not be NULL", K(ret), KP(rebuild_service)); + } else { + rebuild_service->fast_sleep(); + } +} + int ObLSRebuildMgr::generate_rebuild_task_() { int ret = OB_SUCCESS; diff --git a/src/storage/high_availability/ob_rebuild_service.h b/src/storage/high_availability/ob_rebuild_service.h index df46734a78..18b6d48b05 100644 --- a/src/storage/high_availability/ob_rebuild_service.h +++ b/src/storage/high_availability/ob_rebuild_service.h @@ -67,6 +67,7 @@ public: void destroy(); void run1() final; void wakeup(); + void fast_sleep(); void stop(); void wait(); int start(); @@ -107,6 +108,7 @@ private: ObLSService *ls_service_; common::SpinRWLock map_lock_; LSRebuildCtxMap rebuild_ctx_map_; + int64_t fast_sleep_cnt_; DISALLOW_COPY_AND_ASSIGN(ObRebuildService); }; @@ -123,6 +125,7 @@ public: private: void wakeup_(); + void fast_sleep_(); int do_with_init_status_(const ObLSRebuildInfo &rebuild_info); int do_with_doing_status_(const ObLSRebuildInfo &rebuild_info); int do_with_cleanup_status_(const ObLSRebuildInfo &rebuild_info);