[BUGFIX]fix lob extern header for inrow full tmp lob

This commit is contained in:
obdev
2023-02-07 19:07:04 +08:00
committed by ob-robot
parent 2e49086259
commit c6af91add9
2 changed files with 32 additions and 0 deletions

View File

@ -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<int64_t*>(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_));
}
}
}
}

View File

@ -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