diff --git a/src/storage/lob/ob_lob_manager.cpp b/src/storage/lob/ob_lob_manager.cpp index 46b575bc62..596be527b2 100644 --- a/src/storage/lob/ob_lob_manager.cpp +++ b/src/storage/lob/ob_lob_manager.cpp @@ -1017,6 +1017,9 @@ int ObLobManager::append( if (OB_NOT_NULL(param.lob_locator_)) { param.lob_locator_->ptr_ = buf; param.lob_locator_->size_ = total_size; + if (OB_FAIL(fill_lob_locator_extern(param))) { + LOG_WARN("fail to fill lob locator extern", K(ret), KPC(param.lob_locator_)); + } } } } @@ -1373,6 +1376,9 @@ int ObLobManager::append( if (OB_NOT_NULL(param.lob_locator_)) { param.lob_locator_->ptr_ = buf; param.lob_locator_->size_ = total_size; + if (OB_FAIL(fill_lob_locator_extern(param))) { + LOG_WARN("fail to fill lob locator extern", K(ret), KPC(param.lob_locator_)); + } } } } else if (param.lob_locator_ != nullptr && !param.lob_locator_->is_persist_lob()) { @@ -1702,6 +1708,22 @@ int64_t* ObLobManager::get_char_len_ptr(ObLobAccessParam& param) return reinterpret_cast(ptr + LOB_WITH_OUTROW_CTX_SIZE); } +int ObLobManager::fill_lob_locator_extern(ObLobAccessParam& param) +{ + int ret = OB_SUCCESS; + if (OB_NOT_NULL(param.lob_locator_)) { + if (param.lob_locator_->has_extern()) { + ObMemLobExternHeader *ext_header = nullptr; + if (OB_FAIL(param.lob_locator_->get_extern_header(ext_header))) { + LOG_WARN("get extern header failed", K(ret), KPC(param.lob_locator_)); + } else { + ext_header->payload_size_ = param.byte_size_; + } + } + } + return ret; +} + int ObLobManager::getlength(ObLobAccessParam& param, uint64_t &len) { int ret = OB_SUCCESS; @@ -1854,6 +1876,9 @@ int ObLobManager::write_inrow_inner(ObLobAccessParam& param, ObString& data, ObS if (OB_NOT_NULL(param.lob_locator_)) { param.lob_locator_->ptr_ = buf; param.lob_locator_->size_ = res_len; + if (OB_FAIL(fill_lob_locator_extern(param))) { + LOG_WARN("fail to fill lob locator extern", K(ret), KPC(param.lob_locator_)); + } } } return ret; @@ -2879,6 +2904,9 @@ int ObLobManager::erase(ObLobAccessParam& param) } if (OB_NOT_NULL(param.lob_locator_)) { param.lob_locator_->size_ = param.lob_locator_->size_ - byte_len + char_len; + if (OB_FAIL(fill_lob_locator_extern(param))) { + LOG_WARN("fail to fill lob locator extern", K(ret), KPC(param.lob_locator_)); + } } } else { // do erase char* dst_start = data.ptr() + byte_offset; @@ -2894,6 +2922,9 @@ int ObLobManager::erase(ObLobAccessParam& param) } if (OB_NOT_NULL(param.lob_locator_)) { param.lob_locator_->size_ -= byte_len; + if (OB_FAIL(fill_lob_locator_extern(param))) { + LOG_WARN("fail to fill lob locator extern", K(ret), KPC(param.lob_locator_)); + } } } } diff --git a/src/storage/lob/ob_lob_manager.h b/src/storage/lob/ob_lob_manager.h index 2399bdd3dc..e047746fbc 100644 --- a/src/storage/lob/ob_lob_manager.h +++ b/src/storage/lob/ob_lob_manager.h @@ -247,6 +247,7 @@ private: int prepare_lob_common(ObLobAccessParam& param, bool &alloc_inside); bool lob_handle_has_char_len(ObLobAccessParam& param); int64_t* get_char_len_ptr(ObLobAccessParam& param); + int fill_lob_locator_extern(ObLobAccessParam& param); private: static const int64_t DEFAULT_LOB_META_BUCKET_CNT = 1543; static const int64_t LOB_IN_ROW_MAX_LENGTH = 4096; // 4K