fix ddl direct load wait_table_lock() bug

This commit is contained in:
obdev
2023-02-09 17:29:16 +00:00
committed by ob-robot
parent 345a5ef182
commit 7569081da2
3 changed files with 9 additions and 1 deletions

View File

@ -779,6 +779,11 @@ int ObTableRedefinitionTask::repending(const share::ObDDLTaskStatus next_task_st
return ret; return ret;
} }
bool ObTableRedefinitionTask::check_task_status_before_pending(const share::ObDDLTaskStatus task_status)
{
return task_status == ObDDLTaskStatus::PREPARE || task_status == ObDDLTaskStatus::WAIT_TRANS_END || task_status == ObDDLTaskStatus::LOCK_TABLE;
}
int ObTableRedefinitionTask::process() int ObTableRedefinitionTask::process()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;

View File

@ -60,6 +60,7 @@ public:
virtual bool support_longops_monitoring() const override { return true; } virtual bool support_longops_monitoring() const override { return true; }
virtual void flt_set_task_span_tag() const override; virtual void flt_set_task_span_tag() const override;
virtual void flt_set_status_span_tag() const override; virtual void flt_set_status_span_tag() const override;
static bool check_task_status_before_pending(const share::ObDDLTaskStatus task_status);
protected: protected:
int table_redefinition(const share::ObDDLTaskStatus next_task_status); int table_redefinition(const share::ObDDLTaskStatus next_task_status);
int copy_table_dependent_objects(const share::ObDDLTaskStatus next_task_status); int copy_table_dependent_objects(const share::ObDDLTaskStatus next_task_status);

View File

@ -20,6 +20,7 @@
#include "lib/ob_define.h" #include "lib/ob_define.h"
#include "lib/mysqlclient/ob_isql_client.h" #include "lib/mysqlclient/ob_isql_client.h"
#include "sql/engine/cmd/ob_ddl_executor_util.h" #include "sql/engine/cmd/ob_ddl_executor_util.h"
#include "rootserver/ddl_task/ob_table_redefinition_task.h"
namespace oceanbase namespace oceanbase
{ {
@ -228,7 +229,8 @@ int ObDDLServerClient::wait_table_lock(const uint64_t tenant_id, const int64_t t
} else { } else {
int task_status = 0; int task_status = 0;
EXTRACT_INT_FIELD_MYSQL(*result, "status", task_status, int); EXTRACT_INT_FIELD_MYSQL(*result, "status", task_status, int);
if (share::ObDDLTaskStatus::REPENDING != static_cast<share::ObDDLTaskStatus>(task_status)) { share::ObDDLTaskStatus task_cur_status = static_cast<share::ObDDLTaskStatus>(task_status);
if (rootserver::ObTableRedefinitionTask::check_task_status_before_pending(task_cur_status)) {
LOG_INFO("task status not equal REPENDING, Please Keep Waiting", K(task_status)); LOG_INFO("task status not equal REPENDING, Please Keep Waiting", K(task_status));
if (OB_FAIL(sql::ObDDLExecutorUtil::handle_session_exception(session))) { if (OB_FAIL(sql::ObDDLExecutorUtil::handle_session_exception(session))) {
break; break;