fix insert oom caused by wrap allocator's interface empty

This commit is contained in:
leslieyuchen
2022-11-13 02:14:32 +08:00
committed by wangzelin.wzl
parent 7f0d609c5f
commit 4c5f2470b8
29 changed files with 423 additions and 496 deletions

View File

@ -93,6 +93,8 @@ public:
alloc_->free(ptr); ptr = NULL; alloc_->free(ptr); ptr = NULL;
} }
} }
virtual int64_t total() const { return alloc_ != nullptr ? alloc_->total() : 0; }
virtual int64_t used() const { return alloc_ != nullptr ? alloc_->used() : 0; }
void set_alloc(ObIAllocator *alloc) { alloc_ = alloc; } void set_alloc(ObIAllocator *alloc) { alloc_ = alloc; }
ObWrapperAllocator &operator=(const ObWrapperAllocator &that) ObWrapperAllocator &operator=(const ObWrapperAllocator &that)
{ {

View File

@ -567,6 +567,15 @@ DEF_NAME(id, "id")
DEF_NAME(update_start_check_row, "update_start_check_row") DEF_NAME(update_start_check_row, "update_start_check_row")
DEF_NAME(update_end_check_row, "update_end_check_row") DEF_NAME(update_end_check_row, "update_end_check_row")
DEF_NAME_PAIR(get_das_id, "get_das_id")
DEF_NAME_PAIR(do_local_das_task, "do_local_das_task")
DEF_NAME_PAIR(do_remote_das_task, "do_remote_das_task")
DEF_NAME_PAIR(rescan_das_task, "rescan_das_task")
DEF_NAME_PAIR(das_rpc_process, "das_rpc_process")
DEF_NAME_PAIR(close_das_task, "close_das_task")
DEF_NAME_PAIR(fetch_das_extra_result, "fetch_das_extra_result")
DEF_NAME_PAIR(fetch_das_result_process, "fetch_das_result_process")
DEF_NAME(before_calculate_row, "before_calculate_row") DEF_NAME(before_calculate_row, "before_calculate_row")
DEF_NAME(end_calculate_row, "end_calculate_row") DEF_NAME(end_calculate_row, "end_calculate_row")
DEF_NAME(row, "row") DEF_NAME(row, "row")
@ -739,6 +748,7 @@ DEF_NAME(id, "id")
// pc: plan cache // pc: plan cache
// E: executor // E: executor
DEF_NAME_PAIR(S_table_scan, "storage: table scan") DEF_NAME_PAIR(S_table_scan, "storage: table scan")
DEF_NAME_PAIR(S_table_rescan, "storage: table rescan")
DEF_NAME_PAIR(S_revert_iter, "storage: revert iterator") DEF_NAME_PAIR(S_revert_iter, "storage: revert iterator")
DEF_NAME_PAIR(S_delete_rows, "storage: delete rows") DEF_NAME_PAIR(S_delete_rows, "storage: delete rows")
DEF_NAME_PAIR(S_delete_row, "storage: delete row") DEF_NAME_PAIR(S_delete_row, "storage: delete row")

View File

@ -30,7 +30,7 @@ FLT_DEF_SPAN(com_query_process, "com_query process")
FLT_DEF_SPAN(resolve, "resolve syntax tree's semantics and generate statement") FLT_DEF_SPAN(resolve, "resolve syntax tree's semantics and generate statement")
FLT_DEF_SPAN(rewrite, "transform statement") FLT_DEF_SPAN(rewrite, "transform statement")
FLT_DEF_SPAN(optimize, "do cost-base optimization and generate log plan") FLT_DEF_SPAN(optimize, "do cost-base optimization and generate log plan")
FLT_DEF_SPAN(code_generate, "generate physical plan accordding to log plan") FLT_DEF_SPAN(code_generate, "generate physical plan according to log plan")
FLT_DEF_SPAN(sql_execute, "execute physical plan") FLT_DEF_SPAN(sql_execute, "execute physical plan")
//TODO shengle code of open interface need refator //TODO shengle code of open interface need refator
FLT_DEF_SPAN(open, "open plan") FLT_DEF_SPAN(open, "open plan")
@ -38,7 +38,7 @@ FLT_DEF_SPAN(com_query_process, "com_query process")
FLT_DEF_SPAN(px_schedule, "schedule tasks divided by px") FLT_DEF_SPAN(px_schedule, "schedule tasks divided by px")
FLT_DEF_SPAN(px_task, "execution of px's schedule") FLT_DEF_SPAN(px_task, "execution of px's schedule")
FLT_DEF_SPAN(close, "close plan") FLT_DEF_SPAN(close, "close plan")
FLT_DEF_SPAN(cmd_execute, "commmand execute") FLT_DEF_SPAN(cmd_execute, "command execute")
FLT_DEF_SPAN(cmd_open, "command open") FLT_DEF_SPAN(cmd_open, "command open")
// **** for sql end **** // **** for sql end ****
@ -48,7 +48,7 @@ FLT_DEF_SPAN(com_query_process, "com_query process")
FLT_DEF_SPAN(pc_get_pl_object, "get pl object from plan cache") FLT_DEF_SPAN(pc_get_pl_object, "get pl object from plan cache")
FLT_DEF_SPAN(pc_add_pl_object, "add pl object to plan cache") FLT_DEF_SPAN(pc_add_pl_object, "add pl object to plan cache")
FLT_DEF_SPAN(pl_execute, "execute pl object") FLT_DEF_SPAN(pl_execute, "execute pl object")
FLT_DEF_SPAN(pl_spi_query, "exeute pl spi query") FLT_DEF_SPAN(pl_spi_query, "execute pl spi query")
FLT_DEF_SPAN(pl_spi_prepare, "prepare phase of pl execution") FLT_DEF_SPAN(pl_spi_prepare, "prepare phase of pl execution")
FLT_DEF_SPAN(pl_spi_execute, "execute phase of pl execution") FLT_DEF_SPAN(pl_spi_execute, "execute phase of pl execution")
// **** for pl end **** // **** for pl end ****
@ -72,6 +72,16 @@ FLT_DEF_SPAN(com_query_process, "com_query process")
FLT_DEF_SPAN(ps_close, "close phase of ps protocol") FLT_DEF_SPAN(ps_close, "close phase of ps protocol")
// for ps end // for ps end
// for das
FLT_DEF_SPAN(get_das_id, "fetch das task id")
FLT_DEF_SPAN(do_local_das_task, "execute local das task")
FLT_DEF_SPAN(do_remote_das_task, "execute remote das task")
FLT_DEF_SPAN(das_rpc_process, "das task rpc process")
FLT_DEF_SPAN(rescan_das_task, "rescan das task")
FLT_DEF_SPAN(close_das_task, "close das task")
FLT_DEF_SPAN(fetch_das_extra_result, "fetch das extra result")
FLT_DEF_SPAN(fetch_das_result_process, "fetch das result process")
#endif // __HIGH_LEVEL_SPAN #endif // __HIGH_LEVEL_SPAN
#ifdef __MIDDLE_LEVEL_SPAN #ifdef __MIDDLE_LEVEL_SPAN

View File

@ -303,7 +303,7 @@ int ObDASWriteBuffer::try_add_row(const ObIArray<ObExpr*> &exprs,
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_WARN("stored row is null", K(ret)); LOG_WARN("stored row is null", K(ret));
} else { } else {
LOG_DEBUG("add dml_row pay_load here"); LOG_TRACE("add dml_row pay_load here", KPC(stored_row));
} }
} }

View File

@ -51,6 +51,8 @@ int ObDASExtraData::init(const int64_t task_id,
int ObDASExtraData::fetch_result() int ObDASExtraData::fetch_result()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
NG_TRACE(fetch_das_extra_result_begin);
FLTSpanGuard(fetch_das_extra_result);
ObDASDataFetchReq req; ObDASDataFetchReq req;
int64_t tenant_id = MTL_ID(); int64_t tenant_id = MTL_ID();
int64_t timeout = timeout_ts_ - ObTimeUtility::current_time(); int64_t timeout = timeout_ts_ - ObTimeUtility::current_time();
@ -72,6 +74,7 @@ int ObDASExtraData::fetch_result()
LOG_TRACE("das fetch task result", KR(ret), K(req), K(result_)); LOG_TRACE("das fetch task result", KR(ret), K(req), K(result_));
has_more_ = result_.has_more(); has_more_ = result_.has_more();
} }
NG_TRACE(fetch_das_extra_result_end);
return ret; return ret;
} }

View File

@ -245,6 +245,8 @@ int ObDASRef::close_all_task()
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
int last_end_ret = OB_SUCCESS; int last_end_ret = OB_SUCCESS;
if (has_task()) { if (has_task()) {
NG_TRACE(close_das_task_begin);
FLTSpanGuard(close_das_task);
ObSQLSessionInfo *session = nullptr; ObSQLSessionInfo *session = nullptr;
DASTaskIter task_iter = begin_task_iter(); DASTaskIter task_iter = begin_task_iter();
@ -280,6 +282,7 @@ int ObDASRef::close_all_task()
if (task_map_.created()) { if (task_map_.created()) {
task_map_.destroy(); task_map_.destroy();
} }
NG_TRACE(close_das_task_end);
} }
return ret; return ret;
} }

View File

@ -68,11 +68,14 @@ int ObDASSyncAccessP::before_process()
int ObDASSyncAccessP::process() int ObDASSyncAccessP::process()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
NG_TRACE(das_rpc_process_begin);
FLTSpanGuard(das_rpc_process);
ObDASTaskArg &task = arg_; ObDASTaskArg &task = arg_;
ObDASTaskResp &task_resp = result_; ObDASTaskResp &task_resp = result_;
ObIDASTaskOp *task_op = task.get_task_op(); ObIDASTaskOp *task_op = task.get_task_op();
ObIDASTaskResult *task_result = task_resp.get_op_result(); ObIDASTaskResult *task_result = task_resp.get_op_result();
bool has_more = false; bool has_more = false;
ObDASOpType task_type = DAS_OP_INVALID;
//regardless of the success of the task execution, the fllowing meta info must be set //regardless of the success of the task execution, the fllowing meta info must be set
task_result->set_task_id(task_op->get_task_id()); task_result->set_task_id(task_op->get_task_id());
task_resp.set_ctrl_svr(task.get_ctrl_svr()); task_resp.set_ctrl_svr(task.get_ctrl_svr());
@ -87,6 +90,7 @@ int ObDASSyncAccessP::process()
} else if (OB_UNLIKELY(has_more) && OB_FAIL(task_op->fill_extra_result())) { } else if (OB_UNLIKELY(has_more) && OB_FAIL(task_op->fill_extra_result())) {
LOG_WARN("fill extra result to controller failed", KR(ret)); LOG_WARN("fill extra result to controller failed", KR(ret));
} else { } else {
task_type = task_op->get_type();
task_resp.set_has_more(has_more); task_resp.set_has_more(has_more);
ObWarningBuffer *wb = ob_get_tsi_warning_buffer(); ObWarningBuffer *wb = ob_get_tsi_warning_buffer();
if (wb != nullptr) { if (wb != nullptr) {
@ -122,14 +126,19 @@ int ObDASSyncAccessP::process()
} }
} }
LOG_DEBUG("process das sync access task", K(ret), K(task), KPC(task_result), K(has_more)); LOG_DEBUG("process das sync access task", K(ret), K(task), KPC(task_result), K(has_more));
NG_TRACE_EXT(das_rpc_process_end, OB_ID(type), task_type);
return OB_SUCCESS; return OB_SUCCESS;
} }
int ObDASSyncAccessP::after_process(int error_code) int ObDASSyncAccessP::after_process(int error_code)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
const int64_t elapsed_time = common::ObTimeUtility::current_time() - get_receive_timestamp();
if (OB_FAIL(ObDASSyncRpcProcessor::after_process(error_code))) { if (OB_FAIL(ObDASSyncRpcProcessor::after_process(error_code))) {
LOG_WARN("do das sync base rpc process failed", K(ret)); LOG_WARN("do das sync base rpc process failed", K(ret));
} else if (elapsed_time >= ObServerConfig::get_instance().trace_log_slow_query_watermark) {
//slow das task, print trace info
FORCE_PRINT_TRACE(THE_TRACE, "[slow das rpc process]");
} }
//执行相关的错误信息不用传递给RPC框架,RPC框架不处理具体的RPC执行错误信息,始终返回OB_SUCCESS //执行相关的错误信息不用传递给RPC框架,RPC框架不处理具体的RPC执行错误信息,始终返回OB_SUCCESS
return OB_SUCCESS; return OB_SUCCESS;
@ -150,6 +159,8 @@ void ObDASSyncAccessP::cleanup()
int ObDASSyncFetchP::process() int ObDASSyncFetchP::process()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
NG_TRACE(fetch_das_result_process_begin);
FLTSpanGuard(fetch_das_result_process);
ObDASDataFetchReq &req = arg_; ObDASDataFetchReq &req = arg_;
ObDASDataFetchRes &res = result_; ObDASDataFetchRes &res = result_;
ObDataAccessService *das = NULL; ObDataAccessService *das = NULL;
@ -179,9 +190,26 @@ int ObDASSyncFetchP::process()
} else { } else {
res.set_has_more(has_more); res.set_has_more(has_more);
} }
NG_TRACE(fetch_das_result_process_end);
return ret; return ret;
} }
int ObDASAsyncEraseP::process() {
int ObDASSyncFetchP::after_process(int error_code)
{
int ret = OB_SUCCESS;
const int64_t elapsed_time = common::ObTimeUtility::current_time() - get_receive_timestamp();
if (OB_FAIL(ObDASSyncFetchResRpcProcessor::after_process(error_code))) {
LOG_WARN("do das sync base rpc process failed", K(ret));
} else if (elapsed_time >= ObServerConfig::get_instance().trace_log_slow_query_watermark) {
//slow das task, print trace info
FORCE_PRINT_TRACE(THE_TRACE, "[slow das rpc process]");
}
//执行相关的错误信息不用传递给RPC框架,RPC框架不处理具体的RPC执行错误信息,始终返回OB_SUCCESS
return OB_SUCCESS;
}
int ObDASAsyncEraseP::process()
{
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
ObDASDataEraseReq &req = arg_; ObDASDataEraseReq &req = arg_;
ObDataAccessService *das = NULL; ObDataAccessService *das = NULL;

View File

@ -68,7 +68,8 @@ class ObDASSyncFetchP : public ObDASSyncFetchResRpcProcessor
public: public:
ObDASSyncFetchP() {} ObDASSyncFetchP() {}
~ObDASSyncFetchP() {} ~ObDASSyncFetchP() {}
int process(); virtual int process() override;
virtual int after_process(int error_code);
private: private:
DISALLOW_COPY_AND_ASSIGN(ObDASSyncFetchP); DISALLOW_COPY_AND_ASSIGN(ObDASSyncFetchP);
}; };

View File

@ -142,7 +142,6 @@ public:
K_(need_switch_param), K_(need_switch_param),
KPC_(trans_desc), KPC_(trans_desc),
KPC_(snapshot), KPC_(snapshot),
K_(trans_result),
K_(tablet_id), K_(tablet_id),
K_(ls_id), K_(ls_id),
KPC_(tablet_loc), KPC_(tablet_loc),
@ -158,7 +157,6 @@ public:
transaction::ObTxDesc *get_trans_desc() { return trans_desc_; } transaction::ObTxDesc *get_trans_desc() { return trans_desc_; }
void set_snapshot(transaction::ObTxReadSnapshot *snapshot) { snapshot_ = snapshot; } void set_snapshot(transaction::ObTxReadSnapshot *snapshot) { snapshot_ = snapshot; }
transaction::ObTxReadSnapshot *get_snapshot() { return snapshot_; } transaction::ObTxReadSnapshot *get_snapshot() { return snapshot_; }
transaction::ObTxExecResult &get_trans_result() { return trans_result_; }
bool is_local_task() const { return task_started_; } bool is_local_task() const { return task_started_; }
void set_can_part_retry(const bool flag) { can_part_retry_ = flag; } void set_can_part_retry(const bool flag) { can_part_retry_ = flag; }
bool can_part_retry() const { return can_part_retry_; } bool can_part_retry() const { return can_part_retry_; }
@ -192,7 +190,6 @@ protected:
}; };
transaction::ObTxDesc *trans_desc_; //trans desc,事务是全局信息,由RPC框架管理,这里不维护其内存 transaction::ObTxDesc *trans_desc_; //trans desc,事务是全局信息,由RPC框架管理,这里不维护其内存
transaction::ObTxReadSnapshot *snapshot_; // Mvcc snapshot transaction::ObTxReadSnapshot *snapshot_; // Mvcc snapshot
transaction::ObTxExecResult trans_result_; //does not need serialize it
common::ObTabletID tablet_id_; common::ObTabletID tablet_id_;
share::ObLSID ls_id_; share::ObLSID ls_id_;
const ObDASTabletLoc *tablet_loc_; //does not need serialize it const ObDASTabletLoc *tablet_loc_; //does not need serialize it

View File

@ -74,9 +74,12 @@ int ObDataAccessService::execute_das_task(ObDASRef &das_ref, ObIDASTaskOp &task_
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
if (OB_LIKELY(das_ref.is_execute_directly())) { if (OB_LIKELY(das_ref.is_execute_directly())) {
NG_TRACE(do_local_das_task_begin);
FLTSpanGuard(do_local_das_task);
if (OB_FAIL(task_op.start_das_task())) { if (OB_FAIL(task_op.start_das_task())) {
LOG_WARN("start das task failed", K(ret), K(task_op)); LOG_WARN("start das task failed", K(ret), K(task_op));
} }
NG_TRACE(do_local_das_task_end);
} else { } else {
ret = execute_dist_das_task(das_ref, task_op); ret = execute_dist_das_task(das_ref, task_op);
task_op.errcode_ = ret; task_op.errcode_ = ret;
@ -97,6 +100,8 @@ int ObDataAccessService::execute_das_task(ObDASRef &das_ref, ObIDASTaskOp &task_
int ObDataAccessService::get_das_task_id(int64_t &das_id) int ObDataAccessService::get_das_task_id(int64_t &das_id)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
NG_TRACE(get_das_id_begin);
FLTSpanGuard(get_das_id);
const int MAX_RETRY_TIMES = 50; const int MAX_RETRY_TIMES = 50;
int64_t tmp_das_id = 0; int64_t tmp_das_id = 0;
bool force_renew = false; bool force_renew = false;
@ -123,6 +128,7 @@ int ObDataAccessService::get_das_task_id(int64_t &das_id)
if (OB_SUCC(ret)) { if (OB_SUCC(ret)) {
das_id = tmp_das_id; das_id = tmp_das_id;
} }
NG_TRACE(get_das_id_end);
return ret; return ret;
} }
@ -240,6 +246,8 @@ int ObDataAccessService::end_das_task(ObDASRef &das_ref, ObIDASTaskOp &task_op)
int ObDataAccessService::rescan_das_task(ObDASRef &das_ref, ObDASScanOp &scan_op) int ObDataAccessService::rescan_das_task(ObDASRef &das_ref, ObDASScanOp &scan_op)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
NG_TRACE(rescan_das_task_begin);
FLTSpanGuard(rescan_das_task);
if (scan_op.is_local_task()) { if (scan_op.is_local_task()) {
if (OB_FAIL(scan_op.rescan())) { if (OB_FAIL(scan_op.rescan())) {
LOG_WARN("rescan das task failed", K(ret)); LOG_WARN("rescan das task failed", K(ret));
@ -257,6 +265,7 @@ int ObDataAccessService::rescan_das_task(ObDASRef &das_ref, ObDASScanOp &scan_op
LOG_WARN("failed to retry das task", K(tmp_ret)); LOG_WARN("failed to retry das task", K(tmp_ret));
} }
} }
NG_TRACE(rescan_das_task_end);
return ret; return ret;
} }
@ -266,9 +275,12 @@ int ObDataAccessService::do_local_das_task(ObDASRef &das_ref, ObDASTaskArg &task
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
LOG_DEBUG("begin to do local das task", K(task_arg)); LOG_DEBUG("begin to do local das task", K(task_arg));
ObIDASTaskOp *task_op = task_arg.get_task_op(); ObIDASTaskOp *task_op = task_arg.get_task_op();
NG_TRACE(do_local_das_task_begin);
FLTSpanGuard(do_local_das_task);
if (OB_FAIL(task_op->start_das_task())) { if (OB_FAIL(task_op->start_das_task())) {
LOG_WARN("start local das task failed", K(ret)); LOG_WARN("start local das task failed", K(ret));
} }
NG_TRACE(do_local_das_task_end);
return ret; return ret;
} }
@ -276,6 +288,8 @@ int ObDataAccessService::do_remote_das_task(ObDASRef &das_ref, ObDASTaskArg &tas
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
void *resp_buf = nullptr; void *resp_buf = nullptr;
NG_TRACE(do_remote_das_task_begin);
FLTSpanGuard(do_remote_das_task);
ObSQLSessionInfo *session = das_ref.get_exec_ctx().get_my_session(); ObSQLSessionInfo *session = das_ref.get_exec_ctx().get_my_session();
ObPhysicalPlanCtx *plan_ctx = das_ref.get_exec_ctx().get_physical_plan_ctx(); ObPhysicalPlanCtx *plan_ctx = das_ref.get_exec_ctx().get_physical_plan_ctx();
int64_t timeout = plan_ctx->get_timeout_timestamp() - ObTimeUtility::current_time(); int64_t timeout = plan_ctx->get_timeout_timestamp() - ObTimeUtility::current_time();
@ -338,6 +352,7 @@ int ObDataAccessService::do_remote_das_task(ObDASRef &das_ref, ObDASTaskArg &tas
} }
} }
} }
NG_TRACE_EXT(do_remote_das_task_end, Y(ret), OB_ID(addr), task_arg.get_runner_svr());
return ret; return ret;
} }

View File

@ -1239,8 +1239,6 @@ int ObDMLService::write_row_to_das_op(const ObDASDMLBaseCtDef &ctdef,
int64_t simulate_row_cnt = - EVENT_CALL(EventTable::EN_DAS_DML_BUFFER_OVERFLOW); int64_t simulate_row_cnt = - EVENT_CALL(EventTable::EN_DAS_DML_BUFFER_OVERFLOW);
if (OB_UNLIKELY(simulate_row_cnt > 0 && dml_op->get_row_cnt() >= simulate_row_cnt)) { if (OB_UNLIKELY(simulate_row_cnt > 0 && dml_op->get_row_cnt() >= simulate_row_cnt)) {
buffer_full = true; buffer_full = true;
} else if (dml_rtctx.get_das_alloc().used() >= das::OB_DAS_MAX_TOTAL_PACKET_SIZE) {
buffer_full = true;
} else if (OB_FAIL(dml_op->write_row(row, dml_rtctx.get_eval_ctx(), buffer_full))) { } else if (OB_FAIL(dml_op->write_row(row, dml_rtctx.get_eval_ctx(), buffer_full))) {
LOG_WARN("insert row to das dml op buffer failed", K(ret), K(ctdef), K(rtdef)); LOG_WARN("insert row to das dml op buffer failed", K(ret), K(ctdef), K(rtdef));
} }
@ -1263,13 +1261,8 @@ int ObDMLService::write_row_to_das_op(const ObDASDMLBaseCtDef &ctdef,
if (dml_rtctx.need_pick_del_task_first() && if (dml_rtctx.need_pick_del_task_first() &&
OB_FAIL(dml_rtctx.das_ref_.pick_del_task_to_first())) { OB_FAIL(dml_rtctx.das_ref_.pick_del_task_to_first())) {
LOG_WARN("fail to pick delete das task to first", K(ret)); LOG_WARN("fail to pick delete das task to first", K(ret));
} else if (OB_FAIL(dml_rtctx.das_ref_.execute_all_task())) { } else if (OB_FAIL(dml_rtctx.op_.submit_all_dml_task())) {
LOG_WARN("execute all das task failed", K(ret)); LOG_WARN("submit all dml task failed", K(ret));
} else if (OB_FAIL(dml_rtctx.das_ref_.close_all_task())) {
LOG_WARN("close all das task failed", K(ret));
} else {
//don't release all memory, need to reuse das ctx
dml_rtctx.reuse();
} }
} }
} }

View File

@ -125,43 +125,6 @@ int ObTableDeleteOp::inner_open()
return ret; return ret;
} }
int ObTableDeleteOp::inner_get_next_row()
{
int ret = OB_SUCCESS;
if (iter_end_) {
LOG_DEBUG("can't get gi task, iter end", K(MY_SPEC.id_), K(iter_end_));
ret = OB_ITER_END;
} else {
while (OB_SUCC(ret)) {
if (OB_FAIL(try_check_status())) {
LOG_WARN("check status failed", K(ret));
} else if (OB_FAIL(get_next_row_from_child())) {
if (OB_ITER_END != ret) {
LOG_WARN("fail to get next row", K(ret));
} else {
iter_end_ = true;
}
} else if (OB_FAIL(delete_row_to_das())) {
LOG_WARN("delete row to das failed", K(ret));
} else if (is_error_logging_ && err_log_rt_def_.first_err_ret_ != OB_SUCCESS) {
err_log_rt_def_.reset();
continue;
} else if (MY_SPEC.is_returning_) {
break;
}
}
if (OB_ITER_END == ret) {
if (!MY_SPEC.del_ctdefs_.at(0).at(0)->has_instead_of_trigger_ && OB_FAIL(del_rows_post_proc())) {
LOG_WARN("do delete rows post process failed", K(ret));
} else {
//can not overwrite the original error code
ret = OB_ITER_END;
}
}
}
return ret;
}
OB_INLINE int ObTableDeleteOp::inner_open_with_das() OB_INLINE int ObTableDeleteOp::inner_open_with_das()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
@ -256,6 +219,13 @@ OB_INLINE int ObTableDeleteOp::calc_tablet_loc(const ObDelCtDef &del_ctdef,
return ret; return ret;
} }
int ObTableDeleteOp::write_row_to_das_buffer()
{
int ret = OB_SUCCESS;
ret = delete_row_to_das();
return ret;
}
OB_INLINE int ObTableDeleteOp::delete_row_to_das() OB_INLINE int ObTableDeleteOp::delete_row_to_das()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
@ -309,24 +279,21 @@ OB_INLINE int ObTableDeleteOp::delete_row_to_das()
return ret; return ret;
} }
OB_INLINE int ObTableDeleteOp::del_rows_post_proc() int ObTableDeleteOp::write_rows_post_proc(int last_errno)
{ {
int ret = OB_SUCCESS; int ret = last_errno;
if (iter_end_) {
ObPhysicalPlanCtx *plan_ctx = GET_PHY_PLAN_CTX(ctx_); ObPhysicalPlanCtx *plan_ctx = GET_PHY_PLAN_CTX(ctx_);
//iterator end, if das ref has task, need flush all task data to partition storage
if (OB_FAIL(submit_all_dml_task())) {
LOG_WARN("submit all dml task failed", K(ret));
} else {
for (int64_t i = 0; OB_SUCC(ret) && i < del_rtdefs_.count(); ++i) { for (int64_t i = 0; OB_SUCC(ret) && i < del_rtdefs_.count(); ++i) {
plan_ctx->add_affected_rows(del_rtdefs_.at(i).at(0).das_rtdef_.affected_rows_); plan_ctx->add_affected_rows(del_rtdefs_.at(i).at(0).das_rtdef_.affected_rows_);
LOG_DEBUG("del rows post proc", K(plan_ctx->get_affected_rows()), K(del_rtdefs_.at(i).at(0))); LOG_DEBUG("del rows post proc", K(plan_ctx->get_affected_rows()), K(del_rtdefs_.at(i).at(0)));
} }
}
if (OB_SUCC(ret) && GCONF.enable_defensive_check()) { if (OB_SUCC(ret) && GCONF.enable_defensive_check()) {
if (OB_FAIL(check_delete_affected_row())) { if (OB_FAIL(check_delete_affected_row())) {
LOG_WARN("check delete affected row failed", K(ret)); LOG_WARN("check delete affected row failed", K(ret));
} }
} }
}
return ret; return ret;
} }
@ -366,20 +333,6 @@ int ObTableDeleteOp::check_delete_affected_row()
return ret; return ret;
} }
OB_INLINE int ObTableDeleteOp::get_next_row_from_child()
{
int ret = OB_SUCCESS;
clear_evaluated_flag();
if (OB_FAIL(child_->get_next_row())) {
if (OB_ITER_END != ret) {
LOG_WARN("fail to get next row", K(ret));
}
} else {
LOG_TRACE("child output row", "row", ROWEXPR2STR(eval_ctx_, child_->get_spec().output_));
}
return ret;
}
int ObTableDeleteOp::inner_close() int ObTableDeleteOp::inner_close()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;

View File

@ -80,20 +80,19 @@ public:
virtual ~ObTableDeleteOp() {} virtual ~ObTableDeleteOp() {}
protected: protected:
virtual int inner_open() override; virtual int inner_open() override;
virtual int inner_get_next_row() override;
virtual int inner_rescan() override; virtual int inner_rescan() override;
virtual int inner_close() override; virtual int inner_close() override;
protected: protected:
int inner_open_with_das(); int inner_open_with_das();
int delete_row_to_das(); int delete_row_to_das();
int del_rows_post_proc(); virtual int write_rows_post_proc(int last_errno);
int calc_tablet_loc(const ObDelCtDef &del_ctdef, int calc_tablet_loc(const ObDelCtDef &del_ctdef,
ObDelRtDef &del_rtdef, ObDelRtDef &del_rtdef,
ObDASTabletLoc *&tablet_loc); ObDASTabletLoc *&tablet_loc);
int open_table_for_each(); int open_table_for_each();
int close_table_for_each(); int close_table_for_each();
int get_next_row_from_child();
int check_delete_affected_row(); int check_delete_affected_row();
virtual int write_row_to_das_buffer() override;
protected: protected:
DelRtDef2DArray del_rtdefs_; //see the comment of DelCtDef2DArray DelRtDef2DArray del_rtdefs_; //see the comment of DelCtDef2DArray
ObErrLogService err_log_service_; ObErrLogService err_log_service_;

View File

@ -100,7 +100,7 @@ int ObTableInsertAllOp::switch_iterator(ObExecContext &ctx)
return common::OB_ITER_END; return common::OB_ITER_END;
} }
int ObTableInsertAllOp::insert_all_row_to_das() int ObTableInsertAllOp::write_row_to_das_buffer()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
//int64_t savepoint_no = 0; //int64_t savepoint_no = 0;
@ -269,47 +269,6 @@ int ObTableInsertAllOp::inner_rescan()
return ObTableInsertOp::inner_rescan(); return ObTableInsertOp::inner_rescan();
} }
int ObTableInsertAllOp::inner_get_next_row()
{
int ret = OB_SUCCESS;
if (iter_end_) {
LOG_DEBUG("can't get gi task, iter end", K(MY_SPEC.id_), K(iter_end_));
ret = OB_ITER_END;
} else {
while (OB_SUCC(ret)) {
if (OB_FAIL(try_check_status())) {
LOG_WARN("check status failed", K(ret));
} else if (OB_FAIL(ObTableInsertOp::get_next_row_from_child())) {
if (OB_ITER_END != ret) {
LOG_WARN("fail to get next row", K(ret));
} else {
iter_end_ = true;
}
} else if (OB_FAIL(insert_all_row_to_das())) {
LOG_WARN("insert row to das failed", K(ret));
}
//erro logging not support, fix it later
// } else if (is_error_logging_ && err_log_rt_def_.first_err_ret_ != OB_SUCCESS) {
// clear_evaluated_flag();
// err_log_rt_def_.curr_err_log_record_num_++;
// err_log_rt_def_.reset();
// continue;
// } else if (MY_SPEC.is_returning_) {
// break;
// }
}
if (OB_ITER_END == ret) {
if (OB_FAIL(ObTableInsertOp::ins_rows_post_proc())) {
LOG_WARN("do insert rows post process failed", K(ret));
} else {
ret = OB_ITER_END;
}
}
}
return ret;
}
int ObTableInsertAllOp::inner_close() int ObTableInsertAllOp::inner_close()
{ {
return ObTableInsertOp::inner_close(); return ObTableInsertOp::inner_close();

View File

@ -74,11 +74,10 @@ class ObTableInsertAllOp : public ObTableInsertOp
protected: protected:
virtual int inner_open() override; virtual int inner_open() override;
virtual int inner_get_next_row() override;
virtual int inner_rescan() override; virtual int inner_rescan() override;
virtual int inner_close() override; virtual int inner_close() override;
protected: protected:
int insert_all_row_to_das(); virtual int write_row_to_das_buffer() override;
private: private:
int check_match_conditions(const int64_t tbl_idx, int check_match_conditions(const int64_t tbl_idx,
const bool have_insert_row, const bool have_insert_row,

View File

@ -186,6 +186,13 @@ int ObTableInsertOp::calc_tablet_loc(const ObInsCtDef &ins_ctdef,
return ret; return ret;
} }
int ObTableInsertOp::write_row_to_das_buffer()
{
int ret = OB_SUCCESS;
ret = insert_row_to_das();
return ret;
}
OB_INLINE int ObTableInsertOp::insert_row_to_das() OB_INLINE int ObTableInsertOp::insert_row_to_das()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
@ -272,21 +279,15 @@ OB_INLINE int ObTableInsertOp::insert_row_to_das()
if (OB_SUCC(ret)) { if (OB_SUCC(ret)) {
plan_ctx->record_last_insert_id_cur_stmt(); plan_ctx->record_last_insert_id_cur_stmt();
} }
if (OB_ERR_PRIMARY_KEY_DUPLICATE == ret) {
plan_ctx->set_last_insert_id_cur_stmt(0);
}
NG_TRACE(insert_end); NG_TRACE(insert_end);
return ret; return ret;
} }
int ObTableInsertOp::ins_rows_post_proc() int ObTableInsertOp::write_rows_post_proc(int last_errno)
{ {
int ret = OB_SUCCESS; int ret = last_errno;
if (iter_end_) {
ObPhysicalPlanCtx *plan_ctx = GET_PHY_PLAN_CTX(ctx_); ObPhysicalPlanCtx *plan_ctx = GET_PHY_PLAN_CTX(ctx_);
//iterator end, if das ref has task, need flush all task data to partition storage
if (OB_FAIL(submit_all_dml_task())) {
LOG_WARN("execute all insert das task failed", K(ret));
}
if (OB_ERR_PRIMARY_KEY_DUPLICATE == ret) { if (OB_ERR_PRIMARY_KEY_DUPLICATE == ret) {
plan_ctx->set_last_insert_id_cur_stmt(0); plan_ctx->set_last_insert_id_cur_stmt(0);
} }
@ -316,6 +317,16 @@ int ObTableInsertOp::ins_rows_post_proc()
LOG_WARN("check index insert consistency failed", K(ret)); LOG_WARN("check index insert consistency failed", K(ret));
} }
} }
}
// all error, we must rollback with single execute when batch executed
if (OB_SUCCESS != ret && OB_ITER_END != ret) {
ObMultiStmtItem &multi_stmt_item = ctx_.get_sql_ctx()->multi_stmt_item_;
if (MY_SPEC.ins_ctdefs_.at(0).at(0)->das_ctdef_.is_batch_stmt_ && !multi_stmt_item.is_ins_multi_val_opt()) {
int tmp_ret = ret;
ret = OB_BATCHED_MULTI_STMT_ROLLBACK;
LOG_TRACE("batch exec with some exception, rollback with single execute", K(ret), K(tmp_ret));
}
}
return ret; return ret;
} }
@ -392,68 +403,6 @@ int ObTableInsertOp::inner_rescan()
return ret; return ret;
} }
int ObTableInsertOp::get_next_row_from_child()
{
int ret = OB_SUCCESS;
if (OB_FAIL(child_->get_next_row())) {
if (OB_ITER_END != ret) {
LOG_WARN("fail to get next row", K(ret));
}
} else {
clear_evaluated_flag();
LOG_TRACE("child output row", "row", ROWEXPR2STR(eval_ctx_, child_->get_spec().output_));
}
return ret;
}
int ObTableInsertOp::inner_get_next_row()
{
int ret = OB_SUCCESS;
if (iter_end_) {
LOG_DEBUG("can't get gi task, iter end", K(MY_SPEC.id_), K(iter_end_));
ret = OB_ITER_END;
} else {
while (OB_SUCC(ret)) {
if (OB_FAIL(try_check_status())) {
LOG_WARN("check status failed", K(ret));
} else if (OB_FAIL(get_next_row_from_child())) {
if (OB_ITER_END != ret) {
LOG_WARN("fail to get next row", K(ret));
} else {
iter_end_ = true;
}
} else if (OB_FAIL(insert_row_to_das())) {
LOG_WARN("insert row to das failed", K(ret));
} else if (is_error_logging_ && err_log_rt_def_.first_err_ret_ != OB_SUCCESS) {
clear_evaluated_flag();
err_log_rt_def_.curr_err_log_record_num_++;
err_log_rt_def_.reset();
continue;
} else if (MY_SPEC.is_returning_) {
break;
}
}
if (OB_ITER_END == ret) {
if (!MY_SPEC.ins_ctdefs_.at(0).at(0)->has_instead_of_trigger_ && OB_FAIL(ins_rows_post_proc())) {
LOG_WARN("do insert rows post process failed", K(ret));
} else {
ret = OB_ITER_END;
}
}
// all error, we must rollback with single execute when batch executed
if (OB_SUCCESS != ret && OB_ITER_END != ret) {
ObMultiStmtItem &multi_stmt_item = ctx_.get_sql_ctx()->multi_stmt_item_;
if (MY_SPEC.ins_ctdefs_.at(0).at(0)->das_ctdef_.is_batch_stmt_ && !multi_stmt_item.is_ins_multi_val_opt()) {
int tmp_ret = ret;
ret = OB_BATCHED_MULTI_STMT_ROLLBACK;
LOG_TRACE("batch exec with some exception, rollback with single execute", K(ret), K(tmp_ret));
}
}
}
return ret;
}
int ObTableInsertOp::inner_close() int ObTableInsertOp::inner_close()
{ {
NG_TRACE(insert_close); NG_TRACE(insert_close);

View File

@ -77,18 +77,17 @@ public:
virtual ~ObTableInsertOp() {}; virtual ~ObTableInsertOp() {};
protected: protected:
virtual int inner_open() override; virtual int inner_open() override;
virtual int inner_get_next_row() override;
virtual int inner_rescan() override; virtual int inner_rescan() override;
virtual int inner_close() override; virtual int inner_close() override;
protected: protected:
int inner_open_with_das(); int inner_open_with_das();
int insert_row_to_das(); int insert_row_to_das();
int ins_rows_post_proc(); virtual int write_row_to_das_buffer() override;
virtual int write_rows_post_proc(int last_errno) override;
int calc_tablet_loc(const ObInsCtDef &ins_ctdef, int calc_tablet_loc(const ObInsCtDef &ins_ctdef,
ObInsRtDef &ins_rtdef, ObInsRtDef &ins_rtdef,
ObDASTabletLoc *&tablet_loc); ObDASTabletLoc *&tablet_loc);
int open_table_for_each(); int open_table_for_each();
int get_next_row_from_child();
int close_table_for_each(); int close_table_for_each();
int check_insert_affected_row(); int check_insert_affected_row();

View File

@ -854,6 +854,8 @@ int ObTableInsertUpOp::load_batch_insert_up_rows(bool &is_iter_end, int64_t &ins
if (OB_FAIL(get_next_row_from_child())) { if (OB_FAIL(get_next_row_from_child())) {
if (OB_ITER_END != ret) { if (OB_ITER_END != ret) {
LOG_WARN("fail to load next row from child", K(ret)); LOG_WARN("fail to load next row from child", K(ret));
} else {
iter_end_ = true;
} }
} else if (OB_FAIL(try_insert_row())) { } else if (OB_FAIL(try_insert_row())) {
LOG_WARN("try insert row to das", K(ret)); LOG_WARN("try insert row to das", K(ret));

View File

@ -119,7 +119,8 @@ ObTableLockOp::ObTableLockOp(ObExecContext &exec_ctx,
const ObOpSpec &spec, const ObOpSpec &spec,
ObOpInput *input) ObOpInput *input)
: ObTableModifyOp(exec_ctx, spec, input), : ObTableModifyOp(exec_ctx, spec, input),
savepoint_no_(0) savepoint_no_(0),
need_return_row_(false)
{ {
} }
@ -177,108 +178,148 @@ int ObTableLockOp::init_lock_rtdef()
int ObTableLockOp::inner_get_next_row() int ObTableLockOp::inner_get_next_row()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
const ObTableLockSpec &spec = MY_SPEC;
bool need_get_next_row = false;
if (iter_end_) { if (iter_end_) {
LOG_DEBUG("can't get gi task, iter end", K(MY_SPEC.id_), K(iter_end_)); LOG_DEBUG("can't get gi task, iter end", K(MY_SPEC.id_), K(iter_end_));
ret = OB_ITER_END; ret = OB_ITER_END;
} else if (OB_FAIL(try_check_status())) { } else {
need_return_row_ = false;
while (OB_SUCC(ret)) {
if (OB_FAIL(try_check_status())) {
LOG_WARN("check status failed", K(ret)); LOG_WARN("check status failed", K(ret));
} else if (!MY_SPEC.is_skip_locked()) { } else if (OB_FAIL(get_next_row_from_child())) {
if (OB_FAIL(get_next_row_from_child())) {
if (OB_ITER_END != ret) { if (OB_ITER_END != ret) {
LOG_WARN("fail to get next row", K(ret)); LOG_WARN("fail to get next row", K(ret));
} else { } else {
iter_end_ = true; iter_end_ = true;
ret = OB_SUCCESS;
break;
} }
} else if (OB_FAIL(lock_row_to_das())) { } else if (OB_FAIL(lock_row_to_das())) {
LOG_WARN("lock row to das failed", K(ret)); LOG_WARN("write row to das failed", K(ret));
} else if (OB_FAIL(submit_row_by_strategy())) {
LOG_WARN("submit row by strategy failed", K(ret));
} else if (is_error_logging_ && err_log_rt_def_.first_err_ret_ != OB_SUCCESS) {
clear_evaluated_flag();
err_log_rt_def_.curr_err_log_record_num_++;
err_log_rt_def_.reset();
continue;
} else if (need_return_row_) {
//break to output this row
break;
} }
} else if (MY_SPEC.is_skip_locked()) {
do {
need_get_next_row = false;
if (OB_FAIL(get_next_row_from_child())) {
if (OB_ITER_END != ret) {
LOG_WARN("fail to get next row", K(ret));
} else {
iter_end_ = true;
}
} else if (OB_FAIL(lock_row_to_das())) {
LOG_WARN("lock row to das failed", K(ret));
} else if (OB_FAIL(lock_one_row_post_proc(need_get_next_row))) {
LOG_WARN("fail to execute lock_one_row_post_proc", K(ret));
}
} while(need_get_next_row);
} }
if (OB_ITER_END == ret) { if (OB_SUCC(ret) && iter_end_ && dml_rtctx_.das_ref_.has_task()) {
if (OB_FAIL(lock_rows_post_proc(need_get_next_row))) { //DML operator reach iter end,
LOG_WARN("do lock rows post process failed", K(ret)); //now submit the remaining rows in the DAS Write Buffer to the storage
} else { if (OB_FAIL(dml_rtctx_.das_ref_.execute_all_task())) {
//can not overwrite the original error code LOG_WARN("execute all dml das task failed", K(ret));
} else if (OB_FAIL(dml_rtctx_.das_ref_.close_all_task())) {
LOG_WARN("close all das task failed", K(ret));
}
//to post process the DML info after writing all data to the storage
ret = write_rows_post_proc(ret);
}
if (OB_SUCC(ret) && iter_end_) {
ret = OB_ITER_END; ret = OB_ITER_END;
} }
} }
return ret; return ret;
}
int ObTableLockOp::submit_row_by_strategy()
{
int ret = OB_SUCCESS;
if (!MY_SPEC.is_skip_locked()) {
need_return_row_ = true;
if (OB_FAIL(discharge_das_write_buffer())) {
if (OB_TRY_LOCK_ROW_CONFLICT != ret
&& OB_TRANSACTION_SET_VIOLATION != ret
&& OB_ERR_EXCLUSIVE_LOCK_CONFLICT != ret) {
LOG_WARN("failed to lock row with das", K(ret));
} else if (MY_SPEC.is_nowait() && OB_ERR_EXCLUSIVE_LOCK_CONFLICT == ret) {
ret = OB_ERR_EXCLUSIVE_LOCK_CONFLICT_NOWAIT;
}
}
} else if (OB_FAIL(lock_one_row_post_proc())) {
LOG_WARN("lock one row post proc failed", K(ret));
}
return ret;
} }
int ObTableLockOp::inner_get_next_batch(const int64_t max_row_cnt) int ObTableLockOp::inner_get_next_batch(const int64_t max_row_cnt)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
const ObTableLockSpec &spec = MY_SPEC;
const ObBatchRows * child_brs = nullptr;
bool need_get_next_batch = false;
if (iter_end_) { if (iter_end_) {
LOG_DEBUG("can't get gi task, iter end", K(MY_SPEC.id_), K(iter_end_));
brs_.end_ = true; brs_.end_ = true;
brs_.size_ = 0; brs_.size_ = 0;
LOG_DEBUG("can't get gi task, iter end", K(MY_SPEC.id_), K(iter_end_));
if (OB_FAIL(lock_rows_post_proc(need_get_next_batch))) {
LOG_WARN("do lock rows post process failed", K(ret));
}
} else { } else {
if (OB_FAIL(get_next_batch_from_child(max_row_cnt, child_brs))) { need_return_row_ = false;
// do nothing: log is done in previous call const ObBatchRows * child_brs = nullptr;
} else if (OB_FAIL(lock_batch_to_das(child_brs, MY_SPEC.is_skip_locked()))) { while (OB_SUCC(ret)) {
LOG_WARN("lock batch to das failed", K(ret)); if (OB_FAIL(try_check_status())) {
} LOG_WARN("check status failed", K(ret));
} else if (OB_FAIL(get_next_batch_from_child(max_row_cnt, child_brs))) {
if (OB_SUCC(ret) && child_brs->end_ == true) { if (OB_ITER_END == ret) {
if (!MY_SPEC.is_skip_locked() &&
OB_FAIL(lock_rows_post_proc(need_get_next_batch))) {
LOG_WARN("do lock rows post process failed", K(ret));
}
iter_end_ = true; iter_end_ = true;
ret = OB_SUCCESS;
break;
} }
} else if (child_brs->size_ == 0 && child_brs->end_) {
iter_end_ = true;
brs_.end_ = true;
brs_.size_ = 0;
break;
} else if (OB_FAIL(lock_batch_to_das(child_brs))) {
LOG_WARN("write row to das failed", K(ret));
} else if (is_error_logging_ && err_log_rt_def_.first_err_ret_ != OB_SUCCESS) {
clear_evaluated_flag();
err_log_rt_def_.curr_err_log_record_num_++;
err_log_rt_def_.reset();
continue;
} else if (need_return_row_) {
//break to output this batch
break;
}
}
}
if (OB_SUCC(ret) && iter_end_ && dml_rtctx_.das_ref_.has_task()) {
//DML operator reach iter end,
//now submit the remaining rows in the DAS Write Buffer to the storage
if (OB_FAIL(dml_rtctx_.das_ref_.execute_all_task())) {
LOG_WARN("execute all dml das task failed", K(ret));
} else if (OB_FAIL(dml_rtctx_.das_ref_.close_all_task())) {
LOG_WARN("close all das task failed", K(ret));
}
//to post process the DML info after writing all data to the storage
ret = write_rows_post_proc(ret);
} }
return ret; return ret;
} }
// this func only work for for update skip locked // this func only work for for update skip locked
OB_INLINE int ObTableLockOp::lock_one_row_post_proc(bool &need_get_next_row) OB_INLINE int ObTableLockOp::lock_one_row_post_proc()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
need_get_next_row = false;
if (MY_SPEC.is_multi_table_skip_locked_) { if (MY_SPEC.is_multi_table_skip_locked_ &&
if (OB_FAIL(ObSqlTransControl::create_anonymous_savepoint(ctx_, savepoint_no_))) { OB_FAIL(ObSqlTransControl::create_anonymous_savepoint(ctx_, savepoint_no_))) {
LOG_WARN("fail to get save point", K(ret)); LOG_WARN("fail to get save point", K(ret));
} else if (OB_FAIL(submit_all_dml_task())) {
if (OB_TRY_LOCK_ROW_CONFLICT != ret &&
OB_TRANSACTION_SET_VIOLATION != ret &&
OB_ERR_EXCLUSIVE_LOCK_CONFLICT != ret) {
LOG_WARN("submit all dml task failed", K(ret));
} else if (MY_SPEC.is_skip_locked()) {
ret = OB_SUCCESS;
} }
}
if (OB_FAIL(ret)) {
} else if (OB_FAIL(lock_rows_post_proc(need_get_next_row))) {
LOG_WARN("execute lock_rows_post_proc failed", K(ret));
} else if (OB_FAIL(dml_rtctx_.das_ref_.close_all_task())) {
LOG_WARN("close all das task failed", K(ret));
} else { } else {
// don't release all memory, need to reuse das ctx need_return_row_ = true;
dml_rtctx_.reuse();
} }
// if fail must rollback to save point // if fail must rollback to save point
if (OB_SUCC(ret) && need_get_next_row && MY_SPEC.is_multi_table_skip_locked_) { if (OB_SUCC(ret) && !need_return_row_ && MY_SPEC.is_multi_table_skip_locked_) {
if (OB_FAIL(ObSqlTransControl::rollback_savepoint(ctx_, savepoint_no_))) { if (OB_FAIL(ObSqlTransControl::rollback_savepoint(ctx_, savepoint_no_))) {
LOG_WARN("fail to rollback save point", K(ret)); LOG_WARN("fail to rollback save point", K(ret));
} }
@ -286,17 +327,15 @@ OB_INLINE int ObTableLockOp::lock_one_row_post_proc(bool &need_get_next_row)
return ret; return ret;
} }
OB_INLINE int ObTableLockOp::lock_rows_post_proc(bool &need_get_next_row) int ObTableLockOp::write_rows_post_proc(int last_errno)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
//iterator end, if das ref has task, need flush all task data to partition storage if (OB_FAIL(last_errno)) {
if (OB_FAIL(submit_all_dml_task())) {
if (OB_TRY_LOCK_ROW_CONFLICT != ret && if (OB_TRY_LOCK_ROW_CONFLICT != ret &&
OB_TRANSACTION_SET_VIOLATION != ret && OB_TRANSACTION_SET_VIOLATION != ret &&
OB_ERR_EXCLUSIVE_LOCK_CONFLICT != ret) { OB_ERR_EXCLUSIVE_LOCK_CONFLICT != ret) {
LOG_WARN("failed to lock row with das", K(ret)); LOG_WARN("failed to lock row with das", K(ret));
} else if (MY_SPEC.is_skip_locked()) { } else if (MY_SPEC.is_skip_locked()) {
need_get_next_row = true;
ret = OB_SUCCESS; ret = OB_SUCCESS;
} else if (MY_SPEC.is_nowait() && OB_ERR_EXCLUSIVE_LOCK_CONFLICT == ret) { } else if (MY_SPEC.is_nowait() && OB_ERR_EXCLUSIVE_LOCK_CONFLICT == ret) {
ret = OB_ERR_EXCLUSIVE_LOCK_CONFLICT_NOWAIT; ret = OB_ERR_EXCLUSIVE_LOCK_CONFLICT_NOWAIT;
@ -372,11 +411,9 @@ int ObTableLockOp::lock_row_to_das()
return ret; return ret;
} }
int ObTableLockOp::lock_batch_to_das(const ObBatchRows *child_brs, int ObTableLockOp::lock_batch_to_das(const ObBatchRows *child_brs)
const bool skip_locked)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
bool lock_conflict = false;
// Note: there are three evalctx involved in das lock: // Note: there are three evalctx involved in das lock:
// 1. eval_ctx_, // 1. eval_ctx_,
@ -394,40 +431,18 @@ int ObTableLockOp::lock_batch_to_das(const ObBatchRows *child_brs,
operator_evalctx_guard.set_batch_idx(i); operator_evalctx_guard.set_batch_idx(i);
if (OB_FAIL(lock_row_to_das())) { if (OB_FAIL(lock_row_to_das())) {
LOG_WARN("Failed to lock das row", K(i), K(ret)); LOG_WARN("Failed to lock das row", K(i), K(ret));
} } else if (OB_FAIL(submit_row_by_strategy())) {
if (skip_locked) { LOG_WARN("submit row by strategy failed", K(ret));
if (OB_FAIL(lock_one_row_post_proc(lock_conflict))) { } else if (MY_SPEC.is_skip_locked() && !need_return_row_) {
LOG_WARN("fail to execute lock_one_row_post_proc", K(ret)); //lock conflict, skip it
} else {
// NO need to reset lock_conflict inside loop as it is reset within
// routine "lock_one_row_post_proc"
if (lock_conflict) {
brs_.skip_->set(i); brs_.skip_->set(i);
} }
LOG_DEBUG("lock_batch_to_das", K(lock_conflict), K(i),
K(brs_));
}
}
} }
clear_evaluated_flag(); clear_evaluated_flag();
return ret; return ret;
} }
OB_INLINE int ObTableLockOp::get_next_row_from_child()
{
int ret = OB_SUCCESS;
clear_evaluated_flag();
if (OB_FAIL(child_->get_next_row())) {
if (OB_ITER_END != ret) {
LOG_WARN("fail to get next row", K(ret));
}
} else {
LOG_TRACE("child output row", "row", ROWEXPR2STR(eval_ctx_, child_->get_spec().output_));
}
return ret;
}
OB_INLINE int ObTableLockOp::get_next_batch_from_child(const int64_t max_row_cnt, OB_INLINE int ObTableLockOp::get_next_batch_from_child(const int64_t max_row_cnt,
const ObBatchRows *&child_brs) const ObBatchRows *&child_brs)
{ {

View File

@ -113,25 +113,21 @@ public:
int init_lock_rtdef(); int init_lock_rtdef();
protected: protected:
int get_curr_part_key();
int lock_single_part();
int lock_multi_part();
int lock_multi_part_skip_locked();
int prepare_lock_row();
int get_next_row_from_child();
OB_INLINE int get_next_batch_from_child(const int64_t max_row_cnt, OB_INLINE int get_next_batch_from_child(const int64_t max_row_cnt,
const ObBatchRows *&child_brs); const ObBatchRows *&child_brs);
int lock_row_to_das(); int lock_row_to_das();
int lock_batch_to_das(const ObBatchRows *child_brs, const bool skip_locked); int lock_batch_to_das(const ObBatchRows *child_brs);
int calc_tablet_loc(const ObLockCtDef &lock_ctdef, int calc_tablet_loc(const ObLockCtDef &lock_ctdef,
ObLockRtDef &lock_rtdef, ObLockRtDef &lock_rtdef,
ObDASTabletLoc *&tablet_loc); ObDASTabletLoc *&tablet_loc);
int lock_one_row_post_proc(bool &need_get_next_row); int lock_one_row_post_proc();
int lock_rows_post_proc(bool &need_get_next_row); virtual int write_rows_post_proc(int last_errno) override;
int submit_row_by_strategy();
protected: protected:
int64_t savepoint_no_; int64_t savepoint_no_;
LockRtDef2DArray lock_rtdefs_; LockRtDef2DArray lock_rtdefs_;
bool need_return_row_;
}; };
} // end of sql } // end of sql

View File

@ -355,40 +355,7 @@ int ObTableMergeOp::inner_close()
return (OB_SUCCESS == ret) ? close_ret : ret; return (OB_SUCCESS == ret) ? close_ret : ret;
} }
int ObTableMergeOp::inner_get_next_row() int ObTableMergeOp::write_row_to_das_buffer()
{
int ret = OB_SUCCESS;
if (iter_end_) {
LOG_WARN("can't get gi task, iter end", K(MY_SPEC.id_), K(iter_end_));
ret = OB_ITER_END;
} else {
while (OB_SUCC(ret)) {
if (OB_FAIL(try_check_status())) {
LOG_WARN("check status failed", K(ret));
} else if (OB_FAIL(get_next_row_from_child())) {
if (OB_ITER_END != ret) {
LOG_WARN("fail to get next row", K(ret));
} else {
iter_end_ = true;
}
} else if (OB_FAIL(merge_row_to_das())) {
LOG_WARN("merge row to das failed", K(ret));
}
}
if (OB_ITER_END == ret) {
if (OB_FAIL(merge_rows_post_proc())) {
LOG_WARN("do insert rows post process failed", K(ret));
} else {
ret = OB_ITER_END;
}
}
}
return ret;
}
int ObTableMergeOp::merge_row_to_das()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
bool is_match = false; bool is_match = false;
@ -408,27 +375,19 @@ int ObTableMergeOp::merge_row_to_das()
return ret; return ret;
} }
int ObTableMergeOp::merge_rows_post_proc() int ObTableMergeOp::write_rows_post_proc(int last_errno)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
ObPhysicalPlanCtx *plan_ctx = GET_PHY_PLAN_CTX(ctx_); ObPhysicalPlanCtx *plan_ctx = GET_PHY_PLAN_CTX(ctx_);
//iterator end, if das ref has task, need flush all task data to partition storage //iterator end, if das ref has task, need flush all task data to partition storage
if (OB_SUCC(last_errno) && iter_end_) {
if (OB_ISNULL(plan_ctx)) { if (OB_ISNULL(plan_ctx)) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_WARN("plan_ctx is null", K(ret)); LOG_WARN("plan_ctx is null", K(ret));
} else if (OB_FAIL(dml_rtctx_.das_ref_.pick_del_task_to_first())) {
LOG_WARN("pick delete das task to first failed", K(ret));
} else if (OB_FAIL(submit_all_dml_task())) {
LOG_WARN("submit all dml task failed", K(ret));
} else if (OB_FAIL(dml_rtctx_.das_ref_.close_all_task())) {
LOG_WARN("close all das task failed", K(ret));
} else { } else {
dml_rtctx_.reuse();
}
if (OB_SUCC(ret)) {
plan_ctx->add_affected_rows(affected_rows_); plan_ctx->add_affected_rows(affected_rows_);
} }
}
return ret; return ret;
} }
@ -623,20 +582,6 @@ int ObTableMergeOp::do_insert()
return ret; return ret;
} }
OB_INLINE int ObTableMergeOp::get_next_row_from_child()
{
int ret = OB_SUCCESS;
clear_evaluated_flag();
if (OB_FAIL(child_->get_next_row())) {
if (OB_ITER_END != ret) {
LOG_WARN("fail to get next row", K(ret));
}
} else {
LOG_TRACE("child output row", "row", ROWEXPR2STR(eval_ctx_, child_->get_spec().output_));
}
return ret;
}
int ObTableMergeOp::calc_update_tablet_loc(const ObUpdCtDef &upd_ctdef, int ObTableMergeOp::calc_update_tablet_loc(const ObUpdCtDef &upd_ctdef,
ObUpdRtDef &upd_rtdef, ObUpdRtDef &upd_rtdef,
ObDASTabletLoc *&old_tablet_loc, ObDASTabletLoc *&old_tablet_loc,

View File

@ -91,11 +91,6 @@ public:
void inc_affected_rows() { } void inc_affected_rows() { }
void inc_found_rows() { } void inc_found_rows() { }
void inc_changed_rows() { } void inc_changed_rows() { }
virtual int inner_get_next_row();
int get_next_row_from_child();
int merge_row_to_das();
int merge_rows_post_proc();
int do_update(); int do_update();
int update_row_das(); int update_row_das();
int delete_row_das(); int delete_row_das();
@ -119,6 +114,8 @@ protected:
int inner_open_with_das(); int inner_open_with_das();
int open_table_for_each(); int open_table_for_each();
int close_table_for_each(); int close_table_for_each();
virtual int write_row_to_das_buffer() override;
virtual int write_rows_post_proc(int last_errno) override;
protected: protected:
int64_t affected_rows_; int64_t affected_rows_;

View File

@ -1047,5 +1047,85 @@ int ObTableModifyOp::submit_all_dml_task()
return ret; return ret;
} }
//The data to be written by DML will be buffered in the DAS Write Buffer
//When the buffer data exceeds 6M,
//needs to be written to the storage to release the memory.
int ObTableModifyOp::discharge_das_write_buffer()
{
int ret = OB_SUCCESS;
if (dml_rtctx_.das_ref_.get_das_alloc().used() >= das::OB_DAS_MAX_TOTAL_PACKET_SIZE) {
LOG_INFO("DASWriteBuffer full, now to write storage",
"buffer memory", dml_rtctx_.das_ref_.get_das_alloc().used());
ret = submit_all_dml_task();
}
return ret;
}
int ObTableModifyOp::get_next_row_from_child()
{
int ret = OB_SUCCESS;
clear_evaluated_flag();
if (OB_FAIL(child_->get_next_row())) {
if (OB_ITER_END != ret) {
LOG_WARN("fail to get next row", K(ret));
}
} else {
LOG_TRACE("child output row", "row", ROWEXPR2STR(eval_ctx_, child_->get_spec().output_));
}
return ret;
}
int ObTableModifyOp::inner_get_next_row()
{
int ret = OB_SUCCESS;
if (iter_end_) {
LOG_DEBUG("can't get gi task, iter end", K(MY_SPEC.id_), K(iter_end_));
ret = OB_ITER_END;
} else {
while (OB_SUCC(ret)) {
if (OB_FAIL(try_check_status())) {
LOG_WARN("check status failed", K(ret));
} else if (OB_FAIL(get_next_row_from_child())) {
if (OB_ITER_END != ret) {
LOG_WARN("fail to get next row", K(ret));
} else {
iter_end_ = true;
ret = OB_SUCCESS;
break;
}
} else if (OB_FAIL(write_row_to_das_buffer())) {
LOG_WARN("write row to das failed", K(ret));
} else if (OB_FAIL(discharge_das_write_buffer())) {
LOG_WARN("discharge das write buffer failed", K(ret));
} else if (is_error_logging_ && err_log_rt_def_.first_err_ret_ != OB_SUCCESS) {
clear_evaluated_flag();
err_log_rt_def_.curr_err_log_record_num_++;
err_log_rt_def_.reset();
continue;
} else if (MY_SPEC.is_returning_) {
break;
}
}
if (OB_SUCC(ret) && iter_end_ && dml_rtctx_.das_ref_.has_task()) {
//DML operator reach iter end,
//now submit the remaining rows in the DAS Write Buffer to the storage
if (dml_rtctx_.need_pick_del_task_first() &&
OB_FAIL(dml_rtctx_.das_ref_.pick_del_task_to_first())) {
LOG_WARN("pick delete das task to first failed", K(ret));
} else if (OB_FAIL(dml_rtctx_.das_ref_.execute_all_task())) {
LOG_WARN("execute all dml das task failed", K(ret));
} else if (OB_FAIL(dml_rtctx_.das_ref_.close_all_task())) {
LOG_WARN("close all das task failed", K(ret));
}
}
//to post process the DML info after writing all data to the storage or returning one row
ret = write_rows_post_proc(ret);
if (OB_SUCC(ret) && iter_end_) {
ret = OB_ITER_END;
}
}
return ret;
}
} // namespace sql } // namespace sql
} // namespace oceanbase } // namespace oceanbase

View File

@ -205,6 +205,7 @@ public:
void clear_dml_evaluated_flag(); void clear_dml_evaluated_flag();
void clear_dml_evaluated_flag(int64_t parent_cnt, ObExpr **parent_exprs); void clear_dml_evaluated_flag(int64_t parent_cnt, ObExpr **parent_exprs);
void clear_dml_evaluated_flag(ObExpr *clear_expr); void clear_dml_evaluated_flag(ObExpr *clear_expr);
int submit_all_dml_task();
protected: protected:
OperatorOpenOrder get_operator_open_order() const; OperatorOpenOrder get_operator_open_order() const;
virtual int inner_open(); virtual int inner_open();
@ -217,14 +218,24 @@ protected:
int calc_single_table_loc(); int calc_single_table_loc();
virtual int inner_rescan() override; virtual int inner_rescan() override;
virtual int inner_get_next_row() override;
int get_next_row_from_child();
//Override this interface to complete the write semantics of the DML operator,
//and write a row to the DAS Write Buffer according to the specific DML behavior
virtual int write_row_to_das_buffer() { return common::OB_NOT_IMPLEMENT; }
//Override this interface to post process the DML info after
//writing all data to the storage or returning one row
//such as: set affected_rows to query context, rewrite some error code
virtual int write_rows_post_proc(int last_errno)
{ UNUSED(last_errno); return common::OB_NOT_IMPLEMENT; }
int submit_all_dml_task();
int init_das_dml_ctx(); int init_das_dml_ctx();
//to merge array binding cusor info when array binding is executed in batch mode //to merge array binding cusor info when array binding is executed in batch mode
int merge_implict_cursor(int64_t insert_rows, int merge_implict_cursor(int64_t insert_rows,
int64_t update_rows, int64_t update_rows,
int64_t delete_rows, int64_t delete_rows,
int64_t found_rows); int64_t found_rows);
int discharge_das_write_buffer();
public: public:
common::ObMySQLProxy *sql_proxy_; common::ObMySQLProxy *sql_proxy_;
observer::ObInnerSQLConnection *inner_conn_; observer::ObInnerSQLConnection *inner_conn_;

View File

@ -170,42 +170,10 @@ int ObTableUpdateOp::inner_switch_iterator()
return ret; return ret;
} }
int ObTableUpdateOp::inner_get_next_row() int ObTableUpdateOp::write_row_to_das_buffer()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
if (iter_end_) { ret = update_row_to_das();
LOG_DEBUG("can't get gi task, iter end", K(MY_SPEC.id_));
ret = OB_ITER_END;
} else {
while (OB_SUCC(ret)) {
if (OB_FAIL(try_check_status())) {
LOG_WARN("check status failed", K(ret));
} else if (OB_FAIL(get_next_row_from_child())) {
if (OB_ITER_END != ret) {
LOG_WARN("fail to get next row", K(ret));
} else {
iter_end_ = true;
}
} else if (OB_FAIL(update_row_to_das())) {
LOG_WARN("update row to das failed", K(ret));
} else if (is_error_logging_ && err_log_rt_def_.first_err_ret_ != OB_SUCCESS) {
clear_evaluated_flag();
err_log_rt_def_.curr_err_log_record_num_++;
err_log_rt_def_.reset();
continue;
} else if (MY_SPEC.is_returning_) {
break;
}
}
if (OB_ITER_END == ret) {
if (!MY_SPEC.upd_ctdefs_.at(0).at(0)->has_instead_of_trigger_ && OB_FAIL(upd_rows_post_proc())) {
LOG_WARN("do update rows post process failed", K(ret));
} else {
//can not overwrite the original error code
ret = OB_ITER_END;
}
}
}
return ret; return ret;
} }
@ -451,21 +419,14 @@ int ObTableUpdateOp::check_update_affected_row()
return ret; return ret;
} }
OB_INLINE int ObTableUpdateOp::upd_rows_post_proc() int ObTableUpdateOp::write_rows_post_proc(int last_errno)
{ {
int ret = OB_SUCCESS; int ret = last_errno;
if (iter_end_) {
ObPhysicalPlanCtx *plan_ctx = GET_PHY_PLAN_CTX(ctx_); ObPhysicalPlanCtx *plan_ctx = GET_PHY_PLAN_CTX(ctx_);
ObSQLSessionInfo *session = GET_MY_SESSION(ctx_); ObSQLSessionInfo *session = GET_MY_SESSION(ctx_);
int64_t found_rows = 0; int64_t found_rows = 0;
int64_t changed_rows = 0; int64_t changed_rows = 0;
//iterator end, if das ref has task, need flush all task data to partition storage
if (dml_rtctx_.das_ref_.has_task()) {
if (OB_FAIL(dml_rtctx_.das_ref_.pick_del_task_to_first())) {
LOG_WARN("pick delete das task to first failed", K(ret));
} else if (OB_FAIL(submit_all_dml_task())) {
LOG_WARN("execute all update das task failed", K(ret));
}
}
for (int64_t i = 0; OB_SUCC(ret) && i < upd_rtdefs_.count(); ++i) { for (int64_t i = 0; OB_SUCC(ret) && i < upd_rtdefs_.count(); ++i) {
ObUpdRtDef &upd_rtdef = upd_rtdefs_.at(i).at(0); ObUpdRtDef &upd_rtdef = upd_rtdefs_.at(i).at(0);
found_rows += upd_rtdef.found_rows_; found_rows += upd_rtdef.found_rows_;
@ -489,21 +450,8 @@ OB_INLINE int ObTableUpdateOp::upd_rows_post_proc()
LOG_WARN("check index upd consistency failed", K(ret)); LOG_WARN("check index upd consistency failed", K(ret));
} }
} }
return ret;
}
OB_INLINE int ObTableUpdateOp::get_next_row_from_child()
{
int ret = OB_SUCCESS;
clear_evaluated_flag();
if (OB_FAIL(child_->get_next_row())) {
if (OB_ITER_END != ret) {
LOG_WARN("fail to get next row", K(ret));
}
} else {
LOG_TRACE("child output row", "row", ROWEXPR2STR(eval_ctx_, child_->get_spec().output_));
} }
return ret; return ret;
} }
} // end namespace sql } // end namespace sql

View File

@ -90,7 +90,6 @@ public:
int inner_open() override; int inner_open() override;
int inner_rescan() override; int inner_rescan() override;
int inner_switch_iterator() override; int inner_switch_iterator() override;
int inner_get_next_row() override;
int inner_close() override; int inner_close() override;
protected: protected:
int inner_open_with_das(); int inner_open_with_das();
@ -106,8 +105,9 @@ protected:
bool check_exist = false); bool check_exist = false);
int open_table_for_each(); int open_table_for_each();
int close_table_for_each(); int close_table_for_each();
int get_next_row_from_child();
int check_update_affected_row(); int check_update_affected_row();
virtual int write_row_to_das_buffer() override;
virtual int write_rows_post_proc(int last_errno) override;
protected: protected:
UpdRtDef2DArray upd_rtdefs_; //see the comment of UpdCtDef2DArray UpdRtDef2DArray upd_rtdefs_; //see the comment of UpdCtDef2DArray
common::ObArrayWrap<ObInsRtDef> ins_rtdefs_; common::ObArrayWrap<ObInsRtDef> ins_rtdefs_;

View File

@ -714,6 +714,7 @@ void ObLSTabletService::report_tablet_to_rs(
int ObLSTabletService::table_scan(ObTableScanIterator &iter, ObTableScanParam &param, ObNewRowIterator *&result) int ObLSTabletService::table_scan(ObTableScanIterator &iter, ObTableScanParam &param, ObNewRowIterator *&result)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
NG_TRACE(S_table_scan_begin);
ObTabletHandle data_tablet; ObTabletHandle data_tablet;
AllowToReadMgr::AllowToReadInfo read_info; AllowToReadMgr::AllowToReadInfo read_info;
@ -742,12 +743,14 @@ int ObLSTabletService::table_scan(ObTableScanIterator &iter, ObTableScanParam &p
LOG_WARN("ls is not allow to read", K(ret), KPC(ls_)); LOG_WARN("ls is not allow to read", K(ret), KPC(ls_));
} }
} }
NG_TRACE(S_table_scan_end);
return ret; return ret;
} }
int ObLSTabletService::table_rescan(ObTableScanParam &param, ObNewRowIterator *&result) int ObLSTabletService::table_rescan(ObTableScanParam &param, ObNewRowIterator *&result)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
NG_TRACE(S_table_rescan_begin);
ObTabletHandle data_tablet; ObTabletHandle data_tablet;
AllowToReadMgr::AllowToReadInfo read_info; AllowToReadMgr::AllowToReadInfo read_info;
@ -780,6 +783,7 @@ int ObLSTabletService::table_rescan(ObTableScanParam &param, ObNewRowIterator *&
LOG_WARN("ls is not allow to read", K(ret), KPC(ls_)); LOG_WARN("ls is not allow to read", K(ret), KPC(ls_));
} }
} }
NG_TRACE(S_table_rescan_end);
return ret; return ret;
} }
@ -2050,6 +2054,7 @@ int ObLSTabletService::insert_rows(
int64_t &affected_rows) int64_t &affected_rows)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
NG_TRACE(S_insert_rows_begin);
ObTabletHandle tablet_handle; ObTabletHandle tablet_handle;
int64_t afct_num = 0; int64_t afct_num = 0;
int64_t dup_num = 0; int64_t dup_num = 0;
@ -2134,6 +2139,7 @@ int ObLSTabletService::insert_rows(
EVENT_ADD(STORAGE_INSERT_ROW_COUNT, afct_num); EVENT_ADD(STORAGE_INSERT_ROW_COUNT, afct_num);
} }
} }
NG_TRACE(S_insert_rows_end);
return ret; return ret;
} }
@ -2233,6 +2239,7 @@ int ObLSTabletService::update_rows(
int64_t &affected_rows) int64_t &affected_rows)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
NG_TRACE(S_update_rows_begin);
const ObTabletID &data_tablet_id = ctx.tablet_id_; const ObTabletID &data_tablet_id = ctx.tablet_id_;
ObTabletHandle tablet_handle; ObTabletHandle tablet_handle;
int64_t afct_num = 0; int64_t afct_num = 0;
@ -2393,6 +2400,7 @@ int ObLSTabletService::update_rows(
LOG_WARN("update rows use too much time", K(afct_num), K(got_row_count)); LOG_WARN("update rows use too much time", K(afct_num), K(got_row_count));
} }
} }
NG_TRACE(S_update_rows_end);
return ret; return ret;
} }
@ -2477,6 +2485,7 @@ int ObLSTabletService::delete_rows(
int64_t &affected_rows) int64_t &affected_rows)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
NG_TRACE(S_delete_rows_begin);
const ObTabletID &data_tablet_id = ctx.tablet_id_; const ObTabletID &data_tablet_id = ctx.tablet_id_;
ObTabletHandle tablet_handle; ObTabletHandle tablet_handle;
ObRowReshape *row_reshape = nullptr; ObRowReshape *row_reshape = nullptr;
@ -2530,6 +2539,7 @@ int ObLSTabletService::delete_rows(
EVENT_ADD(STORAGE_DELETE_ROW_COUNT, afct_num); EVENT_ADD(STORAGE_DELETE_ROW_COUNT, afct_num);
} }
} }
NG_TRACE(S_delete_rows_end);
return ret; return ret;
} }
@ -2544,6 +2554,7 @@ int ObLSTabletService::lock_rows(
int64_t &affected_rows) int64_t &affected_rows)
{ {
UNUSEDx(lock_flag, is_sfu); UNUSEDx(lock_flag, is_sfu);
NG_TRACE(S_lock_rows_begin);
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
const ObTabletID &data_tablet_id = ctx.tablet_id_; const ObTabletID &data_tablet_id = ctx.tablet_id_;
ObTimeGuard timeguard(__func__, 3 * 1000 * 1000); ObTimeGuard timeguard(__func__, 3 * 1000 * 1000);
@ -2613,6 +2624,7 @@ int ObLSTabletService::lock_rows(
} }
} }
} }
NG_TRACE(S_lock_rows_end);
return ret; return ret;
} }

View File

@ -1040,6 +1040,7 @@ int ObAccessService::reuse_scan_iter(const bool switch_param, ObNewRowIterator *
int ObAccessService::revert_scan_iter(ObNewRowIterator *iter) int ObAccessService::revert_scan_iter(ObNewRowIterator *iter)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
NG_TRACE(S_revert_iter_begin);
if (IS_NOT_INIT) { if (IS_NOT_INIT) {
ret = OB_NOT_INIT; ret = OB_NOT_INIT;
LOG_WARN("access service is not initiated", K(ret)); LOG_WARN("access service is not initiated", K(ret));
@ -1051,7 +1052,7 @@ int ObAccessService::revert_scan_iter(ObNewRowIterator *iter)
iter->~ObNewRowIterator(); iter->~ObNewRowIterator();
} }
iter = nullptr; iter = nullptr;
NG_TRACE(revert_scan_iter); NG_TRACE(S_revert_iter_end);
return ret; return ret;
} }