From 3760b224a2d895fc3a4f057a161eefa3e7a7af44 Mon Sep 17 00:00:00 2001 From: yangqise7en <877793735@qq.com> Date: Fri, 15 Sep 2023 03:13:43 +0000 Subject: [PATCH] fix dag scheduler destroy memleak --- src/share/scheduler/ob_dag_scheduler.cpp | 15 ++++++++------- src/share/scheduler/ob_dag_scheduler.h | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/share/scheduler/ob_dag_scheduler.cpp b/src/share/scheduler/ob_dag_scheduler.cpp index f06cbc6f2..262589071 100755 --- a/src/share/scheduler/ob_dag_scheduler.cpp +++ b/src/share/scheduler/ob_dag_scheduler.cpp @@ -1720,7 +1720,7 @@ void ObTenantDagScheduler::reset() STORAGE_LOG_RET(WARN, tmp_ret, "failed to del sys task", K(tmp_ret), K(cur_dag->get_dag_id())); } } - if (OB_TMP_FAIL(finish_dag_(ObIDag::DAG_STATUS_ABORT, *cur_dag, tmp_dag_net))) { + if (OB_TMP_FAIL(finish_dag_(ObIDag::DAG_STATUS_ABORT, *cur_dag, tmp_dag_net, false/*try_move_child*/))) { STORAGE_LOG_RET(WARN, tmp_ret, "failed to abort dag", K(tmp_ret), KPC(cur_dag)); } else { ++abort_dag_cnt; @@ -2274,7 +2274,7 @@ int ObTenantDagScheduler::check_ls_compaction_dag_exist_with_cancel( if (OB_UNLIKELY(nullptr != cancel_dag->get_dag_net())) { tmp_ret = OB_ERR_UNEXPECTED; COMMON_LOG(WARN, "compaction dag should not in dag net", KR(tmp_ret)); - } else if (OB_TMP_FAIL(finish_dag_(ObIDag::DAG_STATUS_ABORT, *cancel_dag, unused_erase_dag_net))) { + } else if (OB_TMP_FAIL(finish_dag_(ObIDag::DAG_STATUS_ABORT, *cancel_dag, unused_erase_dag_net, false/*try_move_child*/))) { COMMON_LOG(WARN, "failed to erase dag", K(tmp_ret), KPC(cancel_dag)); ob_abort(); } else { @@ -2569,7 +2569,7 @@ int ObTenantDagScheduler::finish_task_in_dag(ObITask &task, ObIDag &dag, ObIDagN if (dag.has_finished()) { ObIDag::ObDagStatus status = dag.is_dag_failed() ? ObIDag::DAG_STATUS_ABORT : ObIDag::DAG_STATUS_FINISH; - if (OB_FAIL(finish_dag_(status, dag, finish_dag_net))) { + if (OB_FAIL(finish_dag_(status, dag, finish_dag_net, true/*try_move_child*/))) { COMMON_LOG(WARN, "failed to finish dag", K(ret), K(dag)); ob_abort(); } @@ -2608,7 +2608,8 @@ int ObTenantDagScheduler::finish_dag_net(ObIDagNet *dag_net) int ObTenantDagScheduler::finish_dag_( const ObIDag::ObDagStatus status, ObIDag &dag, - ObIDagNet *&finish_dag_net) + ObIDagNet *&finish_dag_net, + const bool try_move_child) { int ret = OB_SUCCESS; int tmp_ret = OB_SUCCESS; @@ -2616,7 +2617,7 @@ int ObTenantDagScheduler::finish_dag_( if (OB_FAIL(dag.finish(status))) { COMMON_LOG(WARN, "dag finished failed", K(ret), K(dag), "dag_ret", dag.get_dag_ret()); - } else if (OB_FAIL(try_move_child_to_ready_list(dag))) { + } else if (try_move_child && OB_FAIL(try_move_child_to_ready_list(dag))) { LOG_WARN("failed to try move child to ready list", K(ret), K(&dag)); } else if (OB_FAIL(erase_dag_(dag))) { COMMON_LOG(ERROR, "failed to erase dag from dag_map", K(ret), K(dag)); @@ -2984,7 +2985,7 @@ int ObTenantDagScheduler::pop_task_from_ready_list( cur = cur->get_next(); if (OB_FAIL(tmp_dag->report_result())) { LOG_WARN("failed to report reuslt", K(ret), KPC(tmp_dag)); - } else if (OB_FAIL(finish_dag_(ObIDag::DAG_STATUS_ABORT, *tmp_dag, erase_dag_net))) { + } else if (OB_FAIL(finish_dag_(ObIDag::DAG_STATUS_ABORT, *tmp_dag, erase_dag_net, true/*try_move_child*/))) { COMMON_LOG(ERROR, "failed to finish dag", K(ret), KPC(tmp_dag)); ob_abort(); } else if (OB_NOT_NULL(erase_dag_net)) { @@ -3364,7 +3365,7 @@ int ObTenantDagScheduler::cancel_dag(const ObIDag *dag, ObIDag *parent_dag) } } if (OB_FAIL(ret)) { - } else if (OB_FAIL(finish_dag_(ObIDag::DAG_STATUS_ABORT, *cur_dag, erase_dag_net))) { + } else if (OB_FAIL(finish_dag_(ObIDag::DAG_STATUS_ABORT, *cur_dag, erase_dag_net, true/*try_move_child*/))) { COMMON_LOG(WARN, "failed to erase dag", K(ret), KPC(cur_dag)); ob_abort(); } diff --git a/src/share/scheduler/ob_dag_scheduler.h b/src/share/scheduler/ob_dag_scheduler.h index b49f03436..4259a6dd8 100644 --- a/src/share/scheduler/ob_dag_scheduler.h +++ b/src/share/scheduler/ob_dag_scheduler.h @@ -884,7 +884,7 @@ private: int loop_blocking_dag_net_list(); int loop_running_dag_net_map(); int finish_task_in_dag(ObITask &task, ObIDag &dag, ObIDagNet *&erase_dag_net); - int finish_dag_(const ObIDag::ObDagStatus status, ObIDag &dag, ObIDagNet *&erase_dag_net); + int finish_dag_(const ObIDag::ObDagStatus status, ObIDag &dag, ObIDagNet *&erase_dag_net, const bool try_move_child); int finish_dag_net(ObIDagNet *dag_net); int deal_with_finish_task(ObITask &task, ObTenantDagWorker &worker, int error_code); int deal_with_fail_task(ObITask &task, ObIDag &dag, const int error_code, bool &retry_flag);