diff --git a/src/sql/engine/dml/ob_dml_ctx_define.h b/src/sql/engine/dml/ob_dml_ctx_define.h index 7b7d114b96..8664604216 100644 --- a/src/sql/engine/dml/ob_dml_ctx_define.h +++ b/src/sql/engine/dml/ob_dml_ctx_define.h @@ -928,12 +928,14 @@ struct ObDMLRtCtx ObDMLRtCtx(ObEvalCtx &eval_ctx, ObExecContext &exec_ctx, ObTableModifyOp &op) : das_ref_(eval_ctx, exec_ctx), das_task_status_(), - op_(op) + op_(op), + cached_row_size_(0) { } void reuse() { das_ref_.reuse(); + cached_row_size_ = 0; } void cleanup() @@ -950,10 +952,13 @@ struct ObDMLRtCtx { return das_task_status_.need_pick_del_task_first(); } bool need_non_sub_full_task() { return das_task_status_.need_non_sub_full_task(); } + void add_cached_row_size(const int64_t row_size) { cached_row_size_ += row_size; } + int64_t get_cached_row_size() const { return cached_row_size_; } ObDASRef das_ref_; DasTaskStatus das_task_status_; ObTableModifyOp &op_; + int64_t cached_row_size_; }; template diff --git a/src/sql/engine/dml/ob_dml_service.cpp b/src/sql/engine/dml/ob_dml_service.cpp index 8d0559d31f..8e9d3b724c 100644 --- a/src/sql/engine/dml/ob_dml_service.cpp +++ b/src/sql/engine/dml/ob_dml_service.cpp @@ -1549,16 +1549,18 @@ int ObDMLService::write_row_to_das_op(const ObDASDMLBaseCtDef &ctdef, if (OB_SUCC(ret)) { if (OB_FAIL(dml_op->write_row(row, dml_rtctx.get_eval_ctx(), stored_row, buffer_full))) { LOG_WARN("insert row to das dml op buffer failed", K(ret), K(ctdef), K(rtdef)); + } else if (OB_NOT_NULL(stored_row)) { + dml_rtctx.add_cached_row_size(stored_row->row_size_); } LOG_DEBUG("write row to das op", K(ret), K(buffer_full), "op_type", N, "table_id", ctdef.table_id_, "index_tid", ctdef.index_tid_, - "row", ROWEXPR2STR(dml_rtctx.get_eval_ctx(), row)); + "row", ROWEXPR2STR(dml_rtctx.get_eval_ctx(), row), "row_size", stored_row->row_size_); } //3. if buffer is full, frozen node, create a new das op to add row if (OB_SUCC(ret) && buffer_full) { need_retry = true; if (REACH_COUNT_INTERVAL(10)) { // print log per 10 times. - LOG_INFO("DAS write buffer full, ", K(dml_op->get_row_cnt()), K(dml_rtctx.das_ref_.get_das_mem_used())); + LOG_INFO("DAS write buffer full, ", K(dml_op->get_row_cnt()), K(dml_rtctx.das_ref_.get_das_mem_used()), K(dml_rtctx.get_cached_row_size())); } dml_rtctx.das_ref_.set_frozen_node(); } diff --git a/src/sql/engine/dml/ob_table_modify_op.cpp b/src/sql/engine/dml/ob_table_modify_op.cpp index 9ee293086b..8caf6c0482 100644 --- a/src/sql/engine/dml/ob_table_modify_op.cpp +++ b/src/sql/engine/dml/ob_table_modify_op.cpp @@ -1099,9 +1099,9 @@ int ObTableModifyOp::submit_all_dml_task() int ObTableModifyOp::discharge_das_write_buffer() { int ret = OB_SUCCESS; - if (dml_rtctx_.das_ref_.get_das_mem_used() >= das::OB_DAS_MAX_TOTAL_PACKET_SIZE || execute_single_row_) { + if (dml_rtctx_.get_cached_row_size() >= das::OB_DAS_MAX_TOTAL_PACKET_SIZE || execute_single_row_) { LOG_INFO("DASWriteBuffer full or need single row execution, now to write storage", - "buffer memory", dml_rtctx_.das_ref_.get_das_alloc().used(), K(execute_single_row_)); + "buffer memory", dml_rtctx_.das_ref_.get_das_alloc().used(), K(execute_single_row_), K(dml_rtctx_.get_cached_row_size())); ret = submit_all_dml_task(); } return ret;