ddl do not wait pending in dag

This commit is contained in:
simonjoylet
2022-11-29 03:05:59 +00:00
committed by ob-robot
parent 6fcc624494
commit 9a2e2a79d6
2 changed files with 18 additions and 31 deletions

View File

@ -199,7 +199,8 @@ bool ObDDLTableMergeDag::ignore_warning()
{
return OB_LS_NOT_EXIST == dag_ret_
|| OB_TABLET_NOT_EXIST == dag_ret_
|| OB_TASK_EXPIRED == dag_ret_;
|| OB_TASK_EXPIRED == dag_ret_
|| OB_EAGAIN == dag_ret_;
}
/****************** ObDDLTableDumpTask *****************/
@ -269,7 +270,9 @@ int ObDDLTableDumpTask::process()
} else if (OB_FAIL(ddl_kv_handle.get_ddl_kv(ddl_kv))) {
LOG_WARN("get ddl kv failed", K(ret));
} else if (OB_FAIL(ddl_kv->close())) {
LOG_WARN("close ddl kv failed", K(ret));
if (OB_EAGAIN != ret) {
LOG_WARN("close ddl kv failed", K(ret));
}
} else if (OB_FAIL(ddl_kv_mgr_handle.get_obj()->release_ddl_kvs(freeze_scn_))) {
LOG_WARN("release ddl kv failed", K(ret), K(freeze_scn_));
}

View File

@ -318,7 +318,9 @@ int ObDDLKV::close()
// do nothing
LOG_INFO("ddl kv already closed", K(*this));
} else if (OB_FAIL(wait_pending())) {
LOG_WARN("wait pending failed", K(ret));
if (OB_EAGAIN != ret) {
LOG_WARN("wait pending failed", K(ret));
}
} else if (!is_rebuilder_closed_) {
if (OB_FAIL(index_block_rebuilder_->close())) {
LOG_WARN("index block rebuilder close failed", K(ret));
@ -373,34 +375,16 @@ int ObDDLKV::wait_pending()
LOG_WARN("get ls handle failed", K(ret), K(ls_id_));
} else {
SCN max_decided_scn;
bool wait_ls_ts = true;
bool wait_ddl_redo = true;
const int64_t abs_timeout_ts = ObTimeUtility::fast_current_time() + 1000L * 1000L * 10L;
while (OB_SUCC(ret)) {
if (wait_ls_ts) {
if (OB_FAIL(ls_handle.get_ls()->get_max_decided_scn(max_decided_scn))) {
LOG_WARN("get max decided log ts failed", K(ret), K(ls_id_));
} else {
// max_decided_scn is the left border scn - 1
wait_ls_ts = SCN::plus(max_decided_scn, 1) < freeze_scn_;
}
}
if (OB_SUCC(ret)) {
if (!wait_ls_ts) {
wait_ddl_redo = is_pending();
}
if (wait_ls_ts || wait_ddl_redo) {
if (ObTimeUtility::fast_current_time() > abs_timeout_ts) {
ret = OB_TIMEOUT;
LOG_WARN("wait pending ddl kv timeout", K(ret), K(*this), K(max_decided_scn), K(wait_ls_ts), K(wait_ddl_redo));
} else {
ob_usleep(1L * 1000L); // 1 ms
}
if (REACH_TIME_INTERVAL(1000L * 1000L * 1L)) {
LOG_INFO("wait pending ddl kv", K(ret), K(*this));
}
} else {
break;
if (OB_FAIL(ls_handle.get_ls()->get_max_decided_scn(max_decided_scn))) {
LOG_WARN("get max decided log ts failed", K(ret), K(ls_id_));
} else {
// max_decided_scn is the left border scn - 1
// the min deciding(replay or apply) scn (aka left border) is max_decided_scn + 1
const bool pending_finished = SCN::plus(max_decided_scn, 1) >= freeze_scn_ && !is_pending();
if (!pending_finished) {
ret = OB_EAGAIN;
if (REACH_TIME_INTERVAL(1000L * 1000L)) {
LOG_INFO("wait pending not finish", K(ret), K(*this), K(max_decided_scn));
}
}
}