dont't reuse allocator until prefetch.end

This commit is contained in:
renju96
2024-03-05 09:50:12 +00:00
committed by ob-robot
parent 09286b4e0d
commit 88ba99701b
3 changed files with 32 additions and 6 deletions

View File

@ -721,8 +721,9 @@ int ObDDLSStableAllRangeIterator::get_index_row_count(const ObDatumRange &range,
bool tmp_reach_cursor_end = false;
ObMicroIndexRowItem tmp_index_item;
int64_t tmp_row_offset = 0;
ObArenaAllocator idx_row_allocator("DDL_Row_Cnt", OB_MALLOC_NORMAL_BLOCK_SIZE, MTL_ID());
while (OB_SUCC(ret)) {
if (OB_FAIL(tmp_index_macro_iter.get_next_idx_row(idx_row_allocator_, tmp_index_item, tmp_row_offset, tmp_reach_cursor_end))) {
if (OB_FAIL(tmp_index_macro_iter.get_next_idx_row(idx_row_allocator, tmp_index_item, tmp_row_offset, tmp_reach_cursor_end))) {
if (OB_ITER_END != ret) {
LOG_WARN("fail to get next idx info", K(ret), K(tmp_index_item), K(tmp_reach_cursor_end), K(tmp_index_macro_iter));
} else {
@ -736,6 +737,8 @@ int ObDDLSStableAllRangeIterator::get_index_row_count(const ObDatumRange &range,
if (OB_FAIL(ret)) {
index_row_count = 0;
}
tmp_index_item.reset();
idx_row_allocator.reset();
}
return ret;
}

View File

@ -48,9 +48,17 @@ int ObMicroIndexRowItem::init(ObIAllocator &allocator,
LOG_WARN("invalid arguemen", K(ret), KP(idx_row_header), KP(endkey), KP(idx_minor_info), KP(agg_row_buf));
} else {
allocator_ = &allocator;
endkey_ = endkey; // already deep_copied outside
agg_buf_size_ = agg_buf_size;
void *key_buf = nullptr;
if (OB_ISNULL(key_buf = allocator_->alloc(sizeof(ObDatumRowkey)))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
LOG_WARN("allocate memory failed", K(ret), K(sizeof(ObDatumRowkey)));
} else if (FALSE_IT(endkey_ = new (key_buf) ObDatumRowkey())) {
} else if (OB_FAIL(endkey->deep_copy(*endkey_, allocator))) {
LOG_WARN("fail to deep copy rowkey", K(ret), KPC(endkey_), KPC(endkey));
}
void *header_buf = nullptr;
if (OB_ISNULL(header_buf = allocator_->alloc(sizeof(ObIndexBlockRowHeader)))) {
ret = OB_ALLOCATE_MEMORY_FAILED;
@ -86,9 +94,13 @@ int ObMicroIndexRowItem::init(ObIAllocator &allocator,
void ObMicroIndexRowItem::reset()
{
int ret = OB_SUCCESS;
endkey_ = nullptr;
agg_buf_size_ = 0;
if (OB_NOT_NULL(allocator_)) {
if (OB_NOT_NULL(endkey_)){
endkey_->~ObDatumRowkey();
allocator_->free(endkey_);
endkey_ = nullptr;
}
if (OB_NOT_NULL(idx_row_header_)){
idx_row_header_->~ObIndexBlockRowHeader();
allocator_->free(idx_row_header_);
@ -107,6 +119,17 @@ void ObMicroIndexRowItem::reset()
allocator_ = nullptr;
}
void ObMicroIndexRowItem::reuse()
{
int ret = OB_SUCCESS;
endkey_ = nullptr;
agg_buf_size_ = 0;
idx_row_header_ = nullptr;
idx_minor_info_ = nullptr;
agg_row_buf_ = nullptr;
allocator_ = nullptr;
}
ObIndexBlockMacroIterator::ObIndexBlockMacroIterator()
: sstable_(nullptr), iter_range_(nullptr),
tree_cursor_(), allocator_(nullptr),
@ -361,8 +384,7 @@ int ObIndexBlockMacroIterator::get_next_idx_row(ObIAllocator &item_allocator, Ob
LOG_WARN("Fail to get current endkey", K(ret), K_(tree_cursor));
} else if (OB_FAIL(deep_copy_rowkey(rowkey, curr_key_, curr_key_buf_))) {
STORAGE_LOG(WARN, "Failed to save curr key", K(ret), K(rowkey));
} else if (FALSE_IT(macro_index_item.reset())) {
} else if (FALSE_IT(item_allocator.reuse())) {
} else if (FALSE_IT(macro_index_item.reuse())) {
} else if (OB_FAIL(macro_index_item.init(item_allocator, idx_row_header, &curr_key_, minor_meta_info, agg_row_buf, agg_buf_size))) {
STORAGE_LOG(WARN, "Failed to init macro index item", K(ret), K(macro_index_item));
} else if (OB_FAIL(tree_cursor_.move_forward(is_reverse_scan_))) {

View File

@ -80,11 +80,12 @@ public:
const char *agg_row_buf,
const int64_t agg_buf_size);
void reset();
void reuse();
TO_STRING_KV(KPC(idx_row_header_), KPC(endkey_), KPC(idx_minor_info_), K(agg_row_buf_), K(agg_buf_size_), KP(allocator_));
public:
ObIAllocator *allocator_;
const blocksstable::ObDatumRowkey *endkey_;
blocksstable::ObDatumRowkey *endkey_;
ObIndexBlockRowHeader *idx_row_header_;
ObIndexBlockRowMinorMetaInfo *idx_minor_info_;
char *agg_row_buf_; //max 1024