From eeb7bf454dbe7f09279ccd3a83b48fc0f1fe6433 Mon Sep 17 00:00:00 2001 From: obdev Date: Mon, 3 Apr 2023 22:41:16 +0000 Subject: [PATCH] fix dag_scheduler destroy when running may print ERROR log --- deps/oblib/src/lib/profile/ob_trace_id.h | 2 ++ src/share/scheduler/ob_dag_scheduler.cpp | 21 +++++++++++-------- .../test_dag_net_in_dag_scheduler.cpp | 17 +++++++++++++++ 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/deps/oblib/src/lib/profile/ob_trace_id.h b/deps/oblib/src/lib/profile/ob_trace_id.h index 931c58517..5a5732970 100644 --- a/deps/oblib/src/lib/profile/ob_trace_id.h +++ b/deps/oblib/src/lib/profile/ob_trace_id.h @@ -43,6 +43,8 @@ struct ObCurTraceId OB_UNIS_VERSION(1); public: inline TraceId() { uval_[0] = 0; uval_[1] = 0; uval_[2] = 0; uval_[3] = 0; } + + inline bool is_valid() const { return id_.seq_ != 0; } inline bool is_invalid() const { return id_.seq_ == 0 ? true : false; } inline void init(const ObAddr &ip_port) { diff --git a/src/share/scheduler/ob_dag_scheduler.cpp b/src/share/scheduler/ob_dag_scheduler.cpp index 7d7abed94..11d49f827 100644 --- a/src/share/scheduler/ob_dag_scheduler.cpp +++ b/src/share/scheduler/ob_dag_scheduler.cpp @@ -1632,23 +1632,26 @@ void ObTenantDagScheduler::destroy() int tmp_ret = OB_SUCCESS; for (int64_t j = 0; j < DAG_LIST_MAX; ++j) { for (int64_t i = 0; i < PriorityDagList::PRIO_CNT; ++i) { - const ObIDag *head = dag_list_[j].get_head(i); - const ObIDag *cur_dag = head->get_next(); - const ObIDag *next = NULL; + ObIDag *head = dag_list_[j].get_head(i); + ObIDag *cur_dag = head->get_next(); + ObIDag *next = NULL; + ObIDagNet *tmp_dag_net = nullptr; while (NULL != cur_dag && head != cur_dag) { - if (OB_TMP_FAIL(ObSysTaskStatMgr::get_instance().del_task(cur_dag->get_dag_id()))) { + next = cur_dag->get_next(); + if (cur_dag->get_dag_id().is_valid() + && OB_TMP_FAIL(ObSysTaskStatMgr::get_instance().del_task(cur_dag->get_dag_id()))) { if (OB_ENTRY_NOT_EXIST != tmp_ret) { STORAGE_LOG_RET(WARN, tmp_ret, "failed to del sys task", K(tmp_ret), K(cur_dag->get_dag_id())); } } - next = cur_dag->get_next(); - cur_dag->~ObIDag(); - allocator_.free((void*)cur_dag); + if (OB_TMP_FAIL(finish_dag_(ObIDag::DAG_STATUS_ABORT, *cur_dag, tmp_dag_net))) { + STORAGE_LOG_RET(WARN, tmp_ret, "failed to abort dag", K(tmp_ret), KPC(cur_dag)); + } cur_dag = next; - } + } // end of while } dag_list_[j].reset(); - } + } // end of for blocking_dag_net_list_.reset(); if (dag_map_.created()) { diff --git a/unittest/share/scheduler/test_dag_net_in_dag_scheduler.cpp b/unittest/share/scheduler/test_dag_net_in_dag_scheduler.cpp index c44adc084..a421a7f0d 100644 --- a/unittest/share/scheduler/test_dag_net_in_dag_scheduler.cpp +++ b/unittest/share/scheduler/test_dag_net_in_dag_scheduler.cpp @@ -1542,6 +1542,23 @@ TEST_F(TestDagScheduler, test_cancel_dag_net_func) } +TEST_F(TestDagScheduler, test_destroy_when_running) +{ + ObTenantDagScheduler *scheduler = MTL(ObTenantDagScheduler*); + ASSERT_TRUE(nullptr != scheduler); + + #ifndef BUILD_COVERAGE + // not participate in coverage compilation to fix hang problem + ObCancelDagNet *dag_net = nullptr; + EXPECT_EQ(OB_SUCCESS, scheduler->create_and_add_dag_net(nullptr, dag_net)); + + while (scheduler->get_cur_dag_cnt() < 3) { + usleep(100); + } + #endif +} + + } }