提交 dddbd9dd 编写于 作者: H Handora 提交者: ob-robot

remove big gap tag of btree and fix memory leak of macro block meta

Co-authored-by: Nsimonjoylet <simonjoylet@gmail.com>
上级 6bb75960
......@@ -158,6 +158,12 @@ void ObBlockMetaTree::destroy()
macro_blocks_.reset();
block_tree_.destroy();
data_desc_.reset();
for (int64_t i = 0; i < sorted_rowkeys_.count(); ++i) {
const ObDataMacroBlockMeta *cur_meta = sorted_rowkeys_.at(i).block_meta_;
if (OB_NOT_NULL(cur_meta)) {
cur_meta->~ObDataMacroBlockMeta();
}
}
sorted_rowkeys_.reset();
tree_allocator_.reset();
arena_.reset();
......@@ -216,6 +222,9 @@ int ObBlockMetaTree::build_sorted_rowkeys()
} else if (OB_ISNULL(block_meta)) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("block_meta is null", K(ret), KP(block_meta));
} else if (((uint64_t)(block_meta) & 7ULL) != 0) {
ret = OB_ERR_UNEXPECTED;
LOG_ERROR("invalid btree value", K(ret), KP(block_meta));
} else {
IndexItem cur_item(rowkey_wrapper.rowkey_, block_meta);
cur_item.header_.version_ = ObIndexBlockRowHeader::INDEX_BLOCK_HEADER_V1;
......
......@@ -341,9 +341,6 @@ int ScanHandle<BtreeKey, BtreeVal>::get(BtreeKey &key, BtreeVal &val, bool is_ba
key = leaf->get_key(pos, index);
val = leaf->get_val_with_tag(pos, version_, index);
last_key = is_backward? &leaf->get_key(0, index): &leaf->get_key(leaf->size(index) - 1, index);
if (maybe_big_gap(is_backward)) {
val = (BtreeVal)((uint64_t)val | 2UL);
}
}
return ret;
}
......@@ -457,30 +454,6 @@ int ScanHandle<BtreeKey, BtreeVal>::find_path(BtreeNode *root, BtreeKey key, int
return ret;
}
template<typename BtreeKey, typename BtreeVal>
bool ScanHandle<BtreeKey, BtreeVal>::maybe_big_gap(bool is_backward) {
bool ret = false;
BtreeNode* node = nullptr;
int pos = 0;
MultibitSet *index = &this->index_;
if (0 == path_.top_k(3, node, pos)) {
if (is_backward) {
if (--pos >= 0) {
ret = node->get_tag(pos, index);
} else {
ret = true;
}
} else {
if (++pos < node->size(index)) {
ret = node->get_tag(pos, index);
} else {
ret = true;
}
}
}
return ret;
}
template<typename BtreeKey, typename BtreeVal>
int ScanHandle<BtreeKey, BtreeVal>::scan_forward(const int64_t level) {
int ret = OB_SUCCESS;
......
......@@ -447,7 +447,6 @@ public:
BtreeKey*& last_key, int64_t &gap_size);
int pop_level_node(const int64_t level);
int find_path(BtreeNode *root, BtreeKey key, int64_t version);
bool maybe_big_gap(bool is_backward);
int scan_forward(const int64_t level);
int scan_backward(const int64_t level);
int scan_forward(bool skip_inactive=false, int64_t* skip_cnt=NULL);
......
......@@ -89,10 +89,9 @@ public:
TRANS_LOG(WARN, "get_next from keybtree fail", "ret", ret, "value", value_);
}
} else {
// IN_GAP & BIG_GAP_HINT
key_.encode(key_wrapper.get_rowkey());
iter_flag_ = (uint8_t)((uint64_t)value_ & 3UL);
value_ = (ObMvccRow*)((uint64_t)value_ & ~3UL);
BTREE_ASSERT(((uint64_t)value_ & 7ULL) == 0);
iter_flag_ = 0;
if (OB_ISNULL(value_)) {
ret = common::OB_ITER_END;
} else {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册