From 6e762be4fb91ef6366221fa706b07faced9b5dba Mon Sep 17 00:00:00 2001 From: Hongqin-Li Date: Wed, 28 Dec 2022 13:38:07 +0000 Subject: [PATCH] Consider task count for ddl delay scheduling --- src/rootserver/ddl_task/ob_ddl_scheduler.cpp | 2 +- src/rootserver/ddl_task/ob_ddl_scheduler.h | 1 + src/rootserver/ddl_task/ob_ddl_task.cpp | 8 +++++--- src/rootserver/ddl_task/ob_ddl_task.h | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/rootserver/ddl_task/ob_ddl_scheduler.cpp b/src/rootserver/ddl_task/ob_ddl_scheduler.cpp index b1e20482a..d4a9b32ca 100644 --- a/src/rootserver/ddl_task/ob_ddl_scheduler.cpp +++ b/src/rootserver/ddl_task/ob_ddl_scheduler.cpp @@ -337,7 +337,7 @@ void ObDDLScheduler::run1() } else { ObCurTraceId::set(task->get_trace_id()); int task_ret = task->process(); - task->calc_next_schedule_ts(task_ret); + task->calc_next_schedule_ts(task_ret, task_queue_.get_task_cnt()); if (task->need_retry() && !has_set_stop()) { if (OB_FAIL(task_queue_.add_task_to_last(task))) { STORAGE_LOG(ERROR, "fail to add task to last, which should not happen", K(ret), K(*task)); diff --git a/src/rootserver/ddl_task/ob_ddl_scheduler.h b/src/rootserver/ddl_task/ob_ddl_scheduler.h index 261791920..595665bfd 100644 --- a/src/rootserver/ddl_task/ob_ddl_scheduler.h +++ b/src/rootserver/ddl_task/ob_ddl_scheduler.h @@ -61,6 +61,7 @@ public: int add_task_to_last(ObDDLTask *task); int get_task(const ObDDLTaskKey &task_key, ObDDLTask *&task); int get_task(const int64_t task_id, ObDDLTask *&task); + int64_t get_task_cnt() const { return task_list_.get_size(); } void destroy(); private: typedef common::ObDList TaskList; diff --git a/src/rootserver/ddl_task/ob_ddl_task.cpp b/src/rootserver/ddl_task/ob_ddl_task.cpp index dee28b1b9..60348ec3e 100644 --- a/src/rootserver/ddl_task/ob_ddl_task.cpp +++ b/src/rootserver/ddl_task/ob_ddl_task.cpp @@ -623,13 +623,15 @@ int ObDDLTask::push_execution_id() return ret; } -void ObDDLTask::calc_next_schedule_ts(int ret_code) +// The length of [min_dt, max_dt] controls the execution rate of ddl tasks. +void ObDDLTask::calc_next_schedule_ts(const int ret_code, const int64_t total_task_cnt) { if (OB_TIMEOUT == ret_code) { const int64_t SEC = 1000000; - delay_schedule_time_ = std::min(delay_schedule_time_ * 6/5 + SEC/10, 30*SEC); + const int64_t max_delay = total_task_cnt * ObDDLUtil::get_ddl_rpc_timeout() * 10; + delay_schedule_time_ = std::min(delay_schedule_time_ * 6/5 + SEC/10, max_delay); const int64_t max_dt = delay_schedule_time_; - const int64_t min_dt = std::max(0L, max_dt - 3*SEC); + const int64_t min_dt = max_dt / 2; next_schedule_ts_ = ObTimeUtility::current_time() + ObRandom::rand(min_dt, max_dt); } else { delay_schedule_time_ = 0; diff --git a/src/rootserver/ddl_task/ob_ddl_task.h b/src/rootserver/ddl_task/ob_ddl_task.h index 335a9d3e9..571ebaf2c 100644 --- a/src/rootserver/ddl_task/ob_ddl_task.h +++ b/src/rootserver/ddl_task/ob_ddl_task.h @@ -323,7 +323,7 @@ public: void set_sys_task_id(const TraceId &sys_task_id) { sys_task_id_ = sys_task_id; } void set_sql_exec_addr(const common::ObAddr &addr) { sql_exec_addr_ = addr; } const TraceId &get_sys_task_id() const { return sys_task_id_; } - void calc_next_schedule_ts(int ret_code); + void calc_next_schedule_ts(const int ret_code, const int64_t total_task_cnt); bool need_schedule() { return next_schedule_ts_ <= ObTimeUtility::current_time(); } bool is_replica_build_need_retry(const int ret_code); int push_execution_id();