From eac17747556c9413c6e44da5d4df0aa26cd1ac3a Mon Sep 17 00:00:00 2001 From: shadowao Date: Tue, 25 Jun 2024 17:51:28 +0000 Subject: [PATCH] fix dbms_lob inrow no partial update and ext info log data size --- src/storage/lob/ob_ext_info_callback.cpp | 137 +++++++++++++---------- src/storage/lob/ob_ext_info_callback.h | 9 +- src/storage/lob/ob_lob_manager.cpp | 3 + 3 files changed, 88 insertions(+), 61 deletions(-) diff --git a/src/storage/lob/ob_ext_info_callback.cpp b/src/storage/lob/ob_ext_info_callback.cpp index 920176fc4..c2d983976 100644 --- a/src/storage/lob/ob_ext_info_callback.cpp +++ b/src/storage/lob/ob_ext_info_callback.cpp @@ -116,13 +116,10 @@ int ObJsonDiffLog::deserialize(const char* buf, const int64_t data_len, int64_t& ObExtInfoCallback::~ObExtInfoCallback() { - if (! data_.empty()) { - allocator_->free(data_.ptr()); - data_.assign_ptr(nullptr, 0); - } if (OB_NOT_NULL(mutator_row_buf_)) { allocator_->free(mutator_row_buf_); mutator_row_buf_ = nullptr; + mutator_row_len_ = 0; } } @@ -131,59 +128,53 @@ memtable::MutatorType ObExtInfoCallback::get_mutator_type() const return memtable::MutatorType::MUTATOR_ROW_EXT_INFO; } + +int ObExtInfoCallback::log_submitted(const SCN scn, storage::ObIMemtable *&last_mt) +{ + return release_resource(); +} + +int ObExtInfoCallback::release_resource() +{ + int ret = OB_SUCCESS; + if (nullptr == mutator_row_buf_) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("mutator_row_buf is null", K(ret), KPC(this)); + } else if (OB_ISNULL(allocator_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("allocator is null", K(ret), KPC(this)); + } else { + allocator_->free(mutator_row_buf_); + mutator_row_buf_ = nullptr; + mutator_row_len_ = 0; + } + return ret; +} + int ObExtInfoCallback::get_redo(memtable::RedoDataNode &redo_node) { int ret = OB_SUCCESS; memtable::ObRowData old_row; memtable::ObRowData new_row; - ObDatumRow datum_row; ObTabletID tablet_id; - char *buf = nullptr; - int64_t len = 0; - key_obj_.reset(); - rowkey_.reset(); - key_.reset(); - key_obj_.set_uint64(seq_no_cur_.cast_to_int()); - rowkey_.assign(&key_obj_, OB_EXT_INFO_MUTATOR_ROW_KEY_CNT); - SMART_VAR(blocksstable::ObRowWriter, row_writer) { - if (data_.empty()) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("data is empty", K(ret)); - } else if (OB_FAIL(key_.encode(&rowkey_))) { - LOG_WARN("encode memtable key failed", K(ret), K(rowkey_)); - } else if (OB_NOT_NULL(mutator_row_buf_)) { - // already alloced, so no need alloc again - } else if (OB_FAIL(datum_row.init(*allocator_, OB_EXT_INFO_MUTATOR_ROW_COUNT))) { - LOG_WARN("init datum row fail", K(ret)); - } else if (OB_FAIL(datum_row.storage_datums_[OB_EXT_INFO_MUTATOR_ROW_KEY_IDX].from_obj_enhance(key_obj_))) { - LOG_WARN("set datum fail", K(ret), K(data_)); - } else if (OB_FAIL(datum_row.storage_datums_[OB_EXT_INFO_MUTATOR_ROW_VALUE_IDX].from_buf_enhance(data_.ptr(), data_.length()))) { - LOG_WARN("set datum fail", K(ret), K(data_)); - } else if (OB_FAIL(row_writer.write(OB_EXT_INFO_MUTATOR_ROW_KEY_CNT, datum_row, buf, len))) { - LOG_WARN("write row data fail", K(ret)); - } else if (OB_ISNULL(mutator_row_buf_ = static_cast(allocator_->alloc(len)))) { - ret = OB_ALLOCATE_MEMORY_FAILED; - LOG_WARN("alloc mutator_row_buf fail", K(ret), K(len)); - } else { - MEMCPY(mutator_row_buf_, buf, len); - mutator_row_len_ = len; - } - if (OB_SUCC(ret)) { - new_row.set(mutator_row_buf_, mutator_row_len_); - redo_node.set(&key_, - old_row, - new_row, - dml_flag_, - 1, /* modify_count */ - 0, /* acc_checksum */ - 0, /* version */ - 0, /* flag */ - seq_no_cur_, - tablet_id, - OB_EXT_INFO_MUTATOR_ROW_COUNT); - redo_node.set_callback(this); - } - } // end row_writer + if (OB_ISNULL(mutator_row_buf_) || mutator_row_len_ <= 0) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("mutator_row_buf is empty", K(ret), KP(mutator_row_buf_), K(mutator_row_len_)); + } else { + new_row.set(mutator_row_buf_, mutator_row_len_); + redo_node.set(&key_, + old_row, + new_row, + dml_flag_, + 1, /* modify_count */ + 0, /* acc_checksum */ + 0, /* version */ + 0, /* flag */ + seq_no_cur_, + tablet_id, + OB_EXT_INFO_MUTATOR_ROW_COUNT); + redo_node.set_callback(this); + } return ret; } @@ -194,12 +185,45 @@ int ObExtInfoCallback::set( ObString &data) { int ret = OB_SUCCESS; + ObLobManager *lob_mngr = MTL(ObLobManager*); + ObDatumRow datum_row; + char *buf = nullptr; + int64_t len = 0; + dml_flag_ = dml_flag; seq_no_cur_ = seq_no_cur; - allocator_ = &allocator; - if (OB_FAIL(ob_write_string(allocator, data, data_))) { - LOG_WARN("ob_write_string fail", K(ret), K(data)); - } + allocator_ = &(lob_mngr->get_ext_info_log_allocator()); + + key_obj_.reset(); + rowkey_.reset(); + key_.reset(); + key_obj_.set_uint64(seq_no_cur_.cast_to_int()); + rowkey_.assign(&key_obj_, OB_EXT_INFO_MUTATOR_ROW_KEY_CNT); + SMART_VAR(blocksstable::ObRowWriter, row_writer) { + if (data.empty()) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("data is empty", K(ret)); + } else if (OB_FAIL(key_.encode(&rowkey_))) { + LOG_WARN("encode memtable key failed", K(ret), K(rowkey_)); + } else if (OB_NOT_NULL(mutator_row_buf_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("mutator_row_buf is not null", K(ret), KP(mutator_row_buf_)); + } else if (OB_FAIL(datum_row.init(allocator, OB_EXT_INFO_MUTATOR_ROW_COUNT))) { + LOG_WARN("init datum row fail", K(ret)); + } else if (OB_FAIL(datum_row.storage_datums_[OB_EXT_INFO_MUTATOR_ROW_KEY_IDX].from_obj_enhance(key_obj_))) { + LOG_WARN("set datum fail", K(ret), K(data)); + } else if (OB_FAIL(datum_row.storage_datums_[OB_EXT_INFO_MUTATOR_ROW_VALUE_IDX].from_buf_enhance(data.ptr(), data.length()))) { + LOG_WARN("set datum fail", K(ret), K(data)); + } else if (OB_FAIL(row_writer.write(OB_EXT_INFO_MUTATOR_ROW_KEY_CNT, datum_row, buf, len))) { + LOG_WARN("write row data fail", K(ret)); + } else if (OB_ISNULL(mutator_row_buf_ = static_cast(allocator_->alloc(len)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_WARN("alloc mutator_row_buf fail", K(ret), K(len)); + } else { + MEMCPY(mutator_row_buf_, buf, len); + mutator_row_len_ = len; + } + } // end row_writer return ret; } @@ -257,7 +281,6 @@ int ObExtInfoCbRegister::register_cb( } else { transaction::ObTxSEQ seq_no_cur = seq_no_st_; ObString data; - ObIAllocator &allocator = lob_mngr->get_ext_info_log_allocator(); ObSEArray cb_array; int cb_cnt = 0; while (OB_SUCC(ret) && OB_SUCC(get_data(data))) { @@ -268,7 +291,7 @@ int ObExtInfoCbRegister::register_cb( } else if (OB_FAIL(cb_array.push_back(cb))) { LOG_WARN("push back cb fail", K(ret), K(cb_array)); } else { - cb->set(allocator, dml_flag, seq_no_cur, data); + cb->set(tmp_allocator_, dml_flag, seq_no_cur, data); seq_no_cur = seq_no_cur + 1; if (OB_FAIL(mvcc_ctx_->append_callback(cb))) { LOG_ERROR("register ext info callback failed", K(ret), K(*this),K(*cb)); diff --git a/src/storage/lob/ob_ext_info_callback.h b/src/storage/lob/ob_ext_info_callback.h index 7d23d362e..b6c32be34 100644 --- a/src/storage/lob/ob_ext_info_callback.h +++ b/src/storage/lob/ob_ext_info_callback.h @@ -85,7 +85,6 @@ public: ObExtInfoCallback() : ObITransCallback(), allocator_(nullptr), - data_(), seq_no_cur_(), dml_flag_(blocksstable::ObDmlFlag::DF_MAX), key_obj_(), @@ -99,7 +98,10 @@ public: virtual memtable::MutatorType get_mutator_type() const override; virtual transaction::ObTxSEQ get_seq_no() const override { return seq_no_cur_; } - virtual int64_t get_data_size() override { return data_.length(); }; + virtual int64_t get_data_size() override { return mutator_row_len_; }; + + virtual int log_submitted(const SCN scn, storage::ObIMemtable *&last_mt); + virtual int release_resource(); int get_redo(memtable::RedoDataNode &redo_node); int set( @@ -109,11 +111,10 @@ public: ObString &data); public: - TO_STRING_KV(K(seq_no_cur_), K(dml_flag_), K(data_), K(mutator_row_len_), KP(mutator_row_buf_)); + TO_STRING_KV(K(seq_no_cur_), K(dml_flag_), K(mutator_row_len_), KP(mutator_row_buf_)); private: ObIAllocator *allocator_; - ObString data_; transaction::ObTxSEQ seq_no_cur_; blocksstable::ObDmlFlag dml_flag_; ObObj key_obj_; diff --git a/src/storage/lob/ob_lob_manager.cpp b/src/storage/lob/ob_lob_manager.cpp index 0f4a24cfc..40651c717 100644 --- a/src/storage/lob/ob_lob_manager.cpp +++ b/src/storage/lob/ob_lob_manager.cpp @@ -269,6 +269,9 @@ int ObLobManager::build_tmp_delta_lob_locator(ObIAllocator &allocator, if (OB_ISNULL(persist) || !persist->is_persist_lob()) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid persist lob locator", K(ret), KPC(persist)); + } else if (persist->has_inrow_data()) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("inrow should not build delta lob", K(ret), KPC(persist)); } else { // calc res len uint64_t res_len = ObLobLocatorV2::MEM_LOB_COMMON_HEADER_LEN;