fix: fix the core when has returning expr induced by dml processing order refactor

This commit is contained in:
obdev
2023-03-22 13:45:34 +00:00
committed by ob-robot
parent 8dd6b41ead
commit c95a7ac62c
9 changed files with 105 additions and 74 deletions

View File

@ -57,7 +57,8 @@ const int64_t OB_DAS_MAX_PACKET_SIZE = 2 * 1024 * 1024l - 8 * 1024;
* it can be considered that the DAS request will send at most one RPC request to each zone. * it can be considered that the DAS request will send at most one RPC request to each zone.
* so OB_DAS_MAX_TOTAL_PACKET_SIZE was defined as: * so OB_DAS_MAX_TOTAL_PACKET_SIZE was defined as:
*/ */
const int64_t OB_DAS_MAX_TOTAL_PACKET_SIZE = 3 * OB_DAS_MAX_PACKET_SIZE; const int64_t OB_DAS_MAX_TOTAL_PACKET_SIZE = 2 * OB_DAS_MAX_PACKET_SIZE;
const int64_t OB_DAS_MAX_META_TENANT_PACKET_SIZE = 1 * 1024 * 1024l - 8 * 1024;
} // namespace das } // namespace das
enum class ObDasTaskStatus: uint8_t enum class ObDasTaskStatus: uint8_t

View File

@ -137,6 +137,8 @@ OB_INLINE int ObTableDeleteOp::inner_open_with_das()
int ObTableDeleteOp::check_need_exec_single_row() int ObTableDeleteOp::check_need_exec_single_row()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
ret = ObTableModifyOp::check_need_exec_single_row();
if (OB_SUCC(ret) && !execute_single_row_) {
for (int64_t i = 0; OB_SUCC(ret) && i < MY_SPEC.del_ctdefs_.count() && !execute_single_row_; ++i) { for (int64_t i = 0; OB_SUCC(ret) && i < MY_SPEC.del_ctdefs_.count() && !execute_single_row_; ++i) {
const ObTableDeleteSpec::DelCtDefArray &ctdefs = MY_SPEC.del_ctdefs_.at(i); const ObTableDeleteSpec::DelCtDefArray &ctdefs = MY_SPEC.del_ctdefs_.at(i);
const ObDelCtDef &del_ctdef = *ctdefs.at(0); const ObDelCtDef &del_ctdef = *ctdefs.at(0);
@ -150,6 +152,7 @@ int ObTableDeleteOp::check_need_exec_single_row()
} }
} }
} }
}
return ret; return ret;
} }

View File

@ -104,6 +104,8 @@ int ObTableInsertAllOp::switch_iterator(ObExecContext &ctx)
int ObTableInsertAllOp::check_need_exec_single_row() int ObTableInsertAllOp::check_need_exec_single_row()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
ret = ObTableModifyOp::check_need_exec_single_row();
if (OB_SUCC(ret) && !execute_single_row_) {
for (int64_t i = 0; OB_SUCC(ret) && i < MY_SPEC.ins_ctdefs_.count() && !execute_single_row_; ++i) { for (int64_t i = 0; OB_SUCC(ret) && i < MY_SPEC.ins_ctdefs_.count() && !execute_single_row_; ++i) {
const ObTableInsertSpec::InsCtDefArray &ctdefs = MY_SPEC.ins_ctdefs_.at(i); const ObTableInsertSpec::InsCtDefArray &ctdefs = MY_SPEC.ins_ctdefs_.at(i);
const ObInsCtDef &ins_ctdef = *(ctdefs.at(0)); const ObInsCtDef &ins_ctdef = *(ctdefs.at(0));
@ -123,6 +125,7 @@ int ObTableInsertAllOp::check_need_exec_single_row()
} }
} }
} }
}
return ret; return ret;
} }

View File

@ -111,6 +111,8 @@ OB_DEF_SERIALIZE_SIZE(ObTableInsertSpec)
int ObTableInsertOp::check_need_exec_single_row() int ObTableInsertOp::check_need_exec_single_row()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
ret = ObTableModifyOp::check_need_exec_single_row();
if (OB_SUCC(ret) && !execute_single_row_) {
for (int64_t i = 0; OB_SUCC(ret) && i < MY_SPEC.ins_ctdefs_.count() && !execute_single_row_; ++i) { for (int64_t i = 0; OB_SUCC(ret) && i < MY_SPEC.ins_ctdefs_.count() && !execute_single_row_; ++i) {
const ObTableInsertSpec::InsCtDefArray &ctdefs = MY_SPEC.ins_ctdefs_.at(i); const ObTableInsertSpec::InsCtDefArray &ctdefs = MY_SPEC.ins_ctdefs_.at(i);
const ObInsCtDef &ins_ctdef = *ctdefs.at(0); const ObInsCtDef &ins_ctdef = *ctdefs.at(0);
@ -118,6 +120,7 @@ int ObTableInsertOp::check_need_exec_single_row()
execute_single_row_ = true; execute_single_row_ = true;
} }
} }
}
return ret; return ret;
} }

View File

@ -91,6 +91,8 @@ OB_DEF_SERIALIZE_SIZE(ObTableInsertUpSpec)
int ObTableInsertUpOp::check_need_exec_single_row() int ObTableInsertUpOp::check_need_exec_single_row()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
ret = ObTableModifyOp::check_need_exec_single_row();
if (OB_SUCC(ret) && !execute_single_row_) {
ObInsertUpCtDef *insert_up_ctdef = MY_SPEC.insert_up_ctdefs_.at(0); ObInsertUpCtDef *insert_up_ctdef = MY_SPEC.insert_up_ctdefs_.at(0);
const ObInsCtDef *ins_ctdef = insert_up_ctdef->ins_ctdef_; const ObInsCtDef *ins_ctdef = insert_up_ctdef->ins_ctdef_;
const ObUpdCtDef *upd_ctdef = insert_up_ctdef->upd_ctdef_; const ObUpdCtDef *upd_ctdef = insert_up_ctdef->upd_ctdef_;
@ -103,6 +105,7 @@ int ObTableInsertUpOp::check_need_exec_single_row()
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_WARN("ins_ctdef or upd_ctdef of primary table is nullptr", K(ret)); LOG_WARN("ins_ctdef or upd_ctdef of primary table is nullptr", K(ret));
} }
}
return ret; return ret;
} }

View File

@ -156,6 +156,8 @@ ObTableMergeOp::ObTableMergeOp(ObExecContext &ctx, const ObOpSpec &spec, ObOpInp
int ObTableMergeOp::check_need_exec_single_row() int ObTableMergeOp::check_need_exec_single_row()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
ret = ObTableModifyOp::check_need_exec_single_row();
if (OB_SUCC(ret) && !execute_single_row_) {
ObMergeCtDef *merge_ctdef = MY_SPEC.merge_ctdefs_.at(0); ObMergeCtDef *merge_ctdef = MY_SPEC.merge_ctdefs_.at(0);
if (!execute_single_row_ && OB_NOT_NULL(merge_ctdef->ins_ctdef_)) { if (!execute_single_row_ && OB_NOT_NULL(merge_ctdef->ins_ctdef_)) {
const ObInsCtDef &ins_ctdef = *merge_ctdef->ins_ctdef_; const ObInsCtDef &ins_ctdef = *merge_ctdef->ins_ctdef_;
@ -177,6 +179,7 @@ int ObTableMergeOp::check_need_exec_single_row()
execute_single_row_ = true; execute_single_row_ = true;
} }
} }
}
return ret; return ret;
} }

View File

@ -758,7 +758,9 @@ int ObTableModifyOp::inner_rescan()
int ObTableModifyOp::check_need_exec_single_row() { int ObTableModifyOp::check_need_exec_single_row() {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
execute_single_row_ = false; if (MY_SPEC.is_returning_ && need_foreign_key_checks()) {
execute_single_row_ = true;
}
return ret; return ret;
} }
@ -1099,9 +1101,16 @@ int ObTableModifyOp::submit_all_dml_task()
int ObTableModifyOp::discharge_das_write_buffer() int ObTableModifyOp::discharge_das_write_buffer()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
if (dml_rtctx_.get_cached_row_size() >= das::OB_DAS_MAX_TOTAL_PACKET_SIZE || execute_single_row_) { int64_t simulate_buffer_size = - EVENT_CALL(EventTable::EN_DAS_DML_BUFFER_OVERFLOW);
LOG_INFO("DASWriteBuffer full or need single row execution, now to write storage", int64_t buffer_size_limit = is_meta_tenant(tenant_id_) ? das::OB_DAS_MAX_META_TENANT_PACKET_SIZE : das::OB_DAS_MAX_TOTAL_PACKET_SIZE;
"buffer memory", dml_rtctx_.das_ref_.get_das_alloc().used(), K(execute_single_row_), K(dml_rtctx_.get_cached_row_size())); if (OB_UNLIKELY(simulate_buffer_size > 0)) {
buffer_size_limit = simulate_buffer_size;
}
if (dml_rtctx_.get_cached_row_size() >= buffer_size_limit) {
LOG_INFO("DASWriteBuffer full, now to write storage",
"buffer memory", dml_rtctx_.das_ref_.get_das_alloc().used(), K(dml_rtctx_.get_cached_row_size()));
ret = submit_all_dml_task();
} else if (execute_single_row_) {
ret = submit_all_dml_task(); ret = submit_all_dml_task();
} }
return ret; return ret;

View File

@ -97,6 +97,8 @@ OB_DEF_SERIALIZE_SIZE(ObTableReplaceSpec)
int ObTableReplaceOp::check_need_exec_single_row() int ObTableReplaceOp::check_need_exec_single_row()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
ret = ObTableModifyOp::check_need_exec_single_row();
if (OB_SUCC(ret) && !execute_single_row_) {
ObReplaceCtDef *replace_ctdef = MY_SPEC.replace_ctdefs_.at(0); ObReplaceCtDef *replace_ctdef = MY_SPEC.replace_ctdefs_.at(0);
const ObInsCtDef *ins_ctdef = replace_ctdef->ins_ctdef_; const ObInsCtDef *ins_ctdef = replace_ctdef->ins_ctdef_;
const ObDelCtDef *del_ctdef = replace_ctdef->del_ctdef_; const ObDelCtDef *del_ctdef = replace_ctdef->del_ctdef_;
@ -109,6 +111,7 @@ int ObTableReplaceOp::check_need_exec_single_row()
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_WARN("ins_ctdef or del_ctdef of primary table is nullptr", K(ret)); LOG_WARN("ins_ctdef or del_ctdef of primary table is nullptr", K(ret));
} }
}
return ret; return ret;
} }

View File

@ -116,6 +116,8 @@ ObTableUpdateOp::ObTableUpdateOp(ObExecContext &exec_ctx, const ObOpSpec &spec,
int ObTableUpdateOp::check_need_exec_single_row() int ObTableUpdateOp::check_need_exec_single_row()
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
ret = ObTableModifyOp::check_need_exec_single_row();
if (OB_SUCC(ret) && !execute_single_row_) {
for (int64_t i = 0; OB_SUCC(ret) && i < MY_SPEC.upd_ctdefs_.count() && !execute_single_row_; ++i) { for (int64_t i = 0; OB_SUCC(ret) && i < MY_SPEC.upd_ctdefs_.count() && !execute_single_row_; ++i) {
const ObTableUpdateSpec::UpdCtDefArray &ctdefs = MY_SPEC.upd_ctdefs_.at(i); const ObTableUpdateSpec::UpdCtDefArray &ctdefs = MY_SPEC.upd_ctdefs_.at(i);
const ObUpdCtDef &upd_ctdef = *ctdefs.at(0); const ObUpdCtDef &upd_ctdef = *ctdefs.at(0);
@ -123,6 +125,7 @@ int ObTableUpdateOp::check_need_exec_single_row()
execute_single_row_ = true; execute_single_row_ = true;
} }
} }
}
return ret; return ret;
} }