From e015d113706cdc0cb440ccd0377e8b488678f80f Mon Sep 17 00:00:00 2001 From: joseph12138 <17862707376@163.com> Date: Thu, 29 Jun 2023 06:12:27 +0000 Subject: [PATCH] [4.2] fix core problem because of display tasks --- deps/oblib/src/lib/stat/ob_latch_define.cpp | 2 +- deps/oblib/src/lib/stat/ob_latch_define.h | 3 ++- deps/oblib/src/lib/wait_event/ob_wait_event.h | 1 + src/rootserver/ob_disaster_recovery_worker.cpp | 6 +++++- src/rootserver/ob_disaster_recovery_worker.h | 3 ++- .../virtual_table/ob_all_virtual_ls_replica_task_plan.cpp | 2 -- 6 files changed, 11 insertions(+), 6 deletions(-) diff --git a/deps/oblib/src/lib/stat/ob_latch_define.cpp b/deps/oblib/src/lib/stat/ob_latch_define.cpp index 1cb0a62c72..a6741cb72a 100644 --- a/deps/oblib/src/lib/stat/ob_latch_define.cpp +++ b/deps/oblib/src/lib/stat/ob_latch_define.cpp @@ -22,7 +22,7 @@ const ObLatchDesc OB_LATCHES[] = { #undef LATCH_DEF }; -static_assert(ARRAYSIZEOF(OB_LATCHES) == 306, "DO NOT delete latch defination"); +static_assert(ARRAYSIZEOF(OB_LATCHES) == 307, "DO NOT delete latch defination"); static_assert(ObLatchIds::LATCH_END == ARRAYSIZEOF(OB_LATCHES) - 1, "update id of LATCH_END before adding your defination"); } diff --git a/deps/oblib/src/lib/stat/ob_latch_define.h b/deps/oblib/src/lib/stat/ob_latch_define.h index a2f008601c..b1be7ce5f7 100644 --- a/deps/oblib/src/lib/stat/ob_latch_define.h +++ b/deps/oblib/src/lib/stat/ob_latch_define.h @@ -316,8 +316,9 @@ LATCH_DEF(ALL_SERVERS_INFO_IN_TABLE_LOCK, 301, "all servers info in table lock", LATCH_DEF(OPT_STAT_GATHER_STAT_LOCK, 302, "optimizer stat gather stat lock", LATCH_FIFO, 2000, 0, OPT_STAT_GATHER_STAT_LOCK_WAIT, "optimizer stat gather stat lock") LATCH_DEF(DUP_TABLET_LOCK, 303, "dup tablet lock", LATCH_FIFO, 2000, 0, DUP_TABLET_LOCK_WAIT, "dup tablet lock") LATCH_DEF(TENANT_IO_POOL_LOCK, 304, "tenant io allocator lock", LATCH_FIFO, 2000, 0, TENANT_IO_POOL_WAIT, "tenant io pool lock") +LATCH_DEF(DISPLAY_TASKS_LOCK, 305, "display tasks lock", LATCH_READ_PREFER, 2000, 0, DISPLAY_TASKS_LOCK_WAIT, "display tasks lock") -LATCH_DEF(LATCH_END, 305, "latch end", LATCH_FIFO, 2000, 0, WAIT_EVENT_END, "latch end") +LATCH_DEF(LATCH_END, 306, "latch end", LATCH_FIFO, 2000, 0, WAIT_EVENT_END, "latch end") #endif #ifndef OB_LATCH_DEFINE_H_ diff --git a/deps/oblib/src/lib/wait_event/ob_wait_event.h b/deps/oblib/src/lib/wait_event/ob_wait_event.h index 83821953c6..c2098a3326 100644 --- a/deps/oblib/src/lib/wait_event/ob_wait_event.h +++ b/deps/oblib/src/lib/wait_event/ob_wait_event.h @@ -304,6 +304,7 @@ WAIT_EVENT_DEF(HB_RESPONSES_LOCK_WAIT, 15258, "latch: hb responses lock wait", " WAIT_EVENT_DEF(ALL_SERVERS_INFO_IN_TABLE_LOCK_WAIT, 15259, "latch: all servers info in table lock wait", "address", "number", "tries", CONCURRENCY, "latch: all servers info in table lock wait", true) WAIT_EVENT_DEF(OPT_STAT_GATHER_STAT_LOCK_WAIT, 15260, "latch: optimizer stat gather stat lock wait", "address", "number", "tries", CONCURRENCY, "latch: optimizer stat gather stat lock wait", true) WAIT_EVENT_DEF(TENANT_IO_POOL_WAIT, 15261, "rwlock: tenant io pool wait", "address", "number", "tries", CONCURRENCY, "rwlock: tenant io pool wait", true) +WAIT_EVENT_DEF(DISPLAY_TASKS_LOCK_WAIT, 15262, "latch: display tasks lock wait", "address", "number", "tries", CONCURRENCY, "latch: display tasks lock wait", true) //transaction WAIT_EVENT_DEF(END_TRANS_WAIT, 16001, "wait end trans", "rollback", "trans_hash_value", "participant_count", COMMIT,"wait end trans", false) diff --git a/src/rootserver/ob_disaster_recovery_worker.cpp b/src/rootserver/ob_disaster_recovery_worker.cpp index 39dc85ef55..fcb2c18feb 100755 --- a/src/rootserver/ob_disaster_recovery_worker.cpp +++ b/src/rootserver/ob_disaster_recovery_worker.cpp @@ -1653,7 +1653,8 @@ ObDRWorker::ObDRWorker(volatile bool &stop) rpc_proxy_(nullptr), sql_proxy_(nullptr), task_count_statistic_(), - display_tasks_() + display_tasks_(), + display_tasks_rwlock_(ObLatchIds::DISPLAY_TASKS_LOCK) { } @@ -4579,6 +4580,7 @@ int ObDRWorker::get_task_plan_display( common::ObSArray &task_plan) { int ret = OB_SUCCESS; + SpinWLockGuard guard(display_tasks_rwlock_); task_plan.reset(); if (OB_UNLIKELY(!inited_)) { ret = OB_NOT_INIT; @@ -4586,12 +4588,14 @@ int ObDRWorker::get_task_plan_display( } else if (OB_FAIL(task_plan.assign(display_tasks_))) { LOG_WARN("fail to get dsplay task stat", KR(ret), K_(display_tasks)); } + reset_task_plans_(); return ret; } int ObDRWorker::add_display_info(const ObLSReplicaTaskDisplayInfo &display_info) { int ret = OB_SUCCESS; + SpinWLockGuard guard(display_tasks_rwlock_); if (OB_UNLIKELY(!inited_)) { ret = OB_NOT_INIT; LOG_WARN("not init", KR(ret)); diff --git a/src/rootserver/ob_disaster_recovery_worker.h b/src/rootserver/ob_disaster_recovery_worker.h index 31baf79189..c7aa3fe7a3 100755 --- a/src/rootserver/ob_disaster_recovery_worker.h +++ b/src/rootserver/ob_disaster_recovery_worker.h @@ -127,7 +127,6 @@ public: bool &locality_is_matched); inline int64_t get_display_task_count_() const { return display_tasks_.count(); } - void reset_task_plans() { display_tasks_.reset(); } int get_task_plan_display( common::ObSArray &task_plan); @@ -675,6 +674,7 @@ private: bool &has_leader); private: + void reset_task_plans_() { display_tasks_.reset(); } int check_task_already_exist( const ObDRTaskKey &task_key, @@ -1053,6 +1053,7 @@ private: common::ObMySQLProxy *sql_proxy_; TaskCountStatistic task_count_statistic_; common::ObSArray display_tasks_; + common::SpinRWLock display_tasks_rwlock_; // to protect display_tasks_ }; } // end namespace rootserver } // end namespace oceanbase diff --git a/src/rootserver/virtual_table/ob_all_virtual_ls_replica_task_plan.cpp b/src/rootserver/virtual_table/ob_all_virtual_ls_replica_task_plan.cpp index e4e3f08836..589179b9c1 100644 --- a/src/rootserver/virtual_table/ob_all_virtual_ls_replica_task_plan.cpp +++ b/src/rootserver/virtual_table/ob_all_virtual_ls_replica_task_plan.cpp @@ -110,8 +110,6 @@ int ObAllVirtualLSReplicaTaskPlan::inner_get_next_row(ObNewRow *&row) } } - task_worker_->reset_task_plans(); - if (OB_SUCC(ret)) { scanner_it_ = scanner_.begin(); start_to_read_ = true;