skip ddl_memtable when open sec_meta_iter

This commit is contained in:
renju96 2023-08-03 13:42:26 +00:00 committed by ob-robot
parent ed25ff9dc9
commit a1ecfa86e5
4 changed files with 215 additions and 5 deletions

View File

@ -258,6 +258,209 @@ TEST_F(TestSSTableSecMetaIterator, test_basic)
ASSERT_EQ(OB_ITER_END, tmp_ret);
}
TEST_F(TestSSTableSecMetaIterator, test_ddl_kv)
{
ObArray<ObDataMacroBlockMeta> data_macro_metas;
uint64_t tenant_id = MTL_ID();
const ObITableReadInfo &index_read_info = tablet_handle_.get_obj()->get_rowkey_read_info();
ObSSTableSecMetaIterator meta_iter;
ObDataMacroBlockMeta data_macro_meta;
ObDatumRange range;
range.set_whole_range();
STORAGE_LOG(INFO, "qilu debug range1", K(range));
ASSERT_EQ(OB_SUCCESS, meta_iter.open(
range,
ObMacroBlockMetaType::DATA_BLOCK_META,
ddl_kv_,
index_read_info,
allocator_));
int tmp_ret = OB_SUCCESS;
while (OB_SUCCESS == tmp_ret) {
tmp_ret = meta_iter.get_next(data_macro_meta);
STORAGE_LOG(DEBUG, "Got next data macro block meta", K(tmp_ret), K(data_macro_meta));
if (OB_SUCCESS == tmp_ret) {
ObDataMacroBlockMeta *deep_copy_meta = nullptr;
ASSERT_EQ(OB_SUCCESS, data_macro_meta.deep_copy(deep_copy_meta, allocator_));
ASSERT_EQ(OB_SUCCESS, data_macro_metas.push_back(
*(deep_copy_meta)));
}
}
ASSERT_EQ(OB_ITER_END, tmp_ret);
ASSERT_TRUE(data_macro_metas.count() > 0);
// Iterate sample
const int64_t skip_cnt = 3;
meta_iter.reset();
int64_t iter_cnt = 0;
STORAGE_LOG(INFO, "qilu debug range2", K(range));
ASSERT_EQ(OB_SUCCESS, meta_iter.open(
range,
ObMacroBlockMetaType::DATA_BLOCK_META,
ddl_kv_,
index_read_info,
allocator_,
false, 3));
tmp_ret = OB_SUCCESS;
while (OB_SUCCESS == tmp_ret) {
tmp_ret = meta_iter.get_next(data_macro_meta);
STORAGE_LOG(DEBUG, "Got skip next data macro block meta", K(tmp_ret), K(data_macro_meta));
if (OB_SUCCESS == tmp_ret) {
++iter_cnt;
}
}
int64_t target_scan_cnt = data_macro_metas.count() == 0 ? 0
: 1 + (data_macro_metas.count() - 1) / skip_cnt;
ASSERT_EQ(iter_cnt, target_scan_cnt);
// Iterate part
meta_iter.reset();
const int64_t pivot_rowkey_idx = 0;
ObDatumRowkey pivot_rowkey;
iter_cnt = 0;
ASSERT_EQ(OB_SUCCESS, data_macro_metas.at(pivot_rowkey_idx).get_rowkey(pivot_rowkey));
range.reset();
range.start_key_.set_min_rowkey();
range.end_key_ = pivot_rowkey;
range.border_flag_.unset_inclusive_start();
range.border_flag_.set_inclusive_end();
STORAGE_LOG(INFO, "qilu debug range3", K(range));
ASSERT_EQ(OB_SUCCESS, meta_iter.open(
range,
ObMacroBlockMetaType::DATA_BLOCK_META,
ddl_kv_,
index_read_info,
allocator_));
tmp_ret = OB_SUCCESS;
iter_cnt = 0;
while (OB_SUCCESS == tmp_ret) {
tmp_ret = meta_iter.get_next(data_macro_meta);
if (OB_SUCCESS == tmp_ret) {
++iter_cnt;
}
}
ASSERT_EQ(OB_ITER_END, tmp_ret);
ASSERT_EQ(iter_cnt, pivot_rowkey_idx + 1);
meta_iter.reset();
range.reset();
range.start_key_ = pivot_rowkey;
range.end_key_.set_max_rowkey();
range.border_flag_.unset_inclusive_start();
range.border_flag_.set_inclusive_end();
STORAGE_LOG(INFO, "qilu debug range4", K(range));
ASSERT_EQ(OB_SUCCESS, meta_iter.open(
range,
ObMacroBlockMetaType::DATA_BLOCK_META,
ddl_kv_,
index_read_info,
allocator_));
tmp_ret = OB_SUCCESS;
iter_cnt = 0;
while (OB_SUCCESS == tmp_ret) {
tmp_ret = meta_iter.get_next(data_macro_meta);
if (OB_SUCCESS == tmp_ret) {
++iter_cnt;
}
}
ASSERT_EQ(OB_ITER_END, tmp_ret);
ASSERT_EQ(iter_cnt, data_macro_metas.count() - 1);
// iter range lower than first macro block endkey
ObDatumRow row;
ASSERT_EQ(OB_SUCCESS, row.init(allocator_, MAX_TEST_COLUMN_CNT));
ASSERT_EQ(OB_SUCCESS, row_generate_.get_next_row(min_row_seed_ - 1, row));
meta_iter.reset();
range.reset();
range.start_key_.assign(row.storage_datums_, TEST_ROWKEY_COLUMN_CNT);
range.end_key_.assign(row.storage_datums_, TEST_ROWKEY_COLUMN_CNT);
range.border_flag_.set_inclusive_start();
range.border_flag_.set_inclusive_end();
STORAGE_LOG(INFO, "qilu debug range5", K(range));
ASSERT_EQ(OB_SUCCESS, meta_iter.open(
range,
ObMacroBlockMetaType::DATA_BLOCK_META,
ddl_kv_,
index_read_info,
allocator_));
ASSERT_EQ(OB_SUCCESS, meta_iter.get_next(data_macro_meta));
ASSERT_EQ(OB_ITER_END, meta_iter.get_next(data_macro_meta));
// iter range larger than sstable endkey
meta_iter.reset();
range.reset();
row.reuse();
ASSERT_EQ(OB_SUCCESS, row_generate_.get_next_row(max_row_seed_ + 1, row));
range.start_key_.assign(row.storage_datums_, TEST_ROWKEY_COLUMN_CNT);
range.end_key_.assign(row.storage_datums_, TEST_ROWKEY_COLUMN_CNT);
range.border_flag_.set_inclusive_start();
range.border_flag_.set_inclusive_end();
STORAGE_LOG(INFO, "qilu debug range6", K(range));
ASSERT_EQ(OB_SUCCESS, meta_iter.open(
range,
ObMacroBlockMetaType::DATA_BLOCK_META,
ddl_kv_,
index_read_info,
allocator_));
// Dual iter part
ObDualMacroMetaIterator dual_iter;
ObMacroBlockDesc macro_desc;
const int64_t pivot_rowkey_idx_2 = 3;
ObDatumRowkey pivot_rowkey_2;
iter_cnt = 0;
ASSERT_EQ(OB_SUCCESS, data_macro_metas.at(pivot_rowkey_idx_2).get_rowkey(pivot_rowkey_2));
range.reset();
range.start_key_ = pivot_rowkey;
range.end_key_ = pivot_rowkey_2;
range.border_flag_.unset_inclusive_start();
// range.border_flag_.set_inclusive_start();
range.border_flag_.set_inclusive_end();
macro_desc.macro_meta_ = &data_macro_meta;
STORAGE_LOG(INFO, "show query range", K(range));
ASSERT_EQ(OB_SUCCESS, dual_iter.open(sstable_, range, index_read_info, allocator_));
tmp_ret = OB_SUCCESS;
while (OB_SUCCESS == tmp_ret) {
tmp_ret = dual_iter.get_next_macro_block(macro_desc);
if (OB_SUCCESS == tmp_ret) {
STORAGE_LOG(DEBUG, "Got next data macro block meta", K(tmp_ret), K(macro_desc));
}
}
ASSERT_EQ(OB_ITER_END, tmp_ret);
// range.border_flag_.set_inclusive_start();
range.border_flag_.unset_inclusive_start();
range.border_flag_.unset_inclusive_end();
dual_iter.reset();
ASSERT_EQ(OB_SUCCESS, dual_iter.open(sstable_, range, index_read_info, allocator_));
tmp_ret = OB_SUCCESS;
while (OB_SUCCESS == tmp_ret) {
tmp_ret = dual_iter.get_next_macro_block(macro_desc);
if (OB_SUCCESS == tmp_ret) {
STORAGE_LOG(DEBUG, "Got next data macro block meta", K(tmp_ret), K(macro_desc));
}
}
ASSERT_EQ(OB_ITER_END, tmp_ret);
dual_iter.reset();
range.end_key_.set_max_rowkey();
range.border_flag_.unset_inclusive_start();
range.border_flag_.unset_inclusive_end();
ASSERT_EQ(OB_SUCCESS, dual_iter.open(sstable_, range, index_read_info, allocator_));
tmp_ret = OB_SUCCESS;
while (OB_SUCCESS == tmp_ret) {
tmp_ret = dual_iter.get_next_macro_block(macro_desc);
if (OB_SUCCESS == tmp_ret) {
STORAGE_LOG(INFO, "Got next data macro block meta", K(tmp_ret), K(macro_desc));
}
}
ObDatumRowkey endkey;
ASSERT_EQ(OB_SUCCESS, sstable_.get_last_rowkey(allocator_, endkey));
ASSERT_EQ(OB_ITER_END, tmp_ret);
}
TEST_F(TestSSTableSecMetaIterator, test_dual_iter)
{
uint64_t tenant_id = MTL_ID();

View File

@ -640,7 +640,7 @@ int ObSSTable::scan_secondary_meta(
} else if (OB_FAIL(iter->open(
query_range, meta_type, *this, rowkey_read_info, allocator, is_reverse_scan, sample_step))) {
LOG_WARN("Fail to open secondary meta iterator with range",
K(ret), K(query_range), K(meta_type), K_(meta), K(is_reverse_scan), K(sample_step));
K(ret), K(query_range), K(meta_type), K_(meta), K(is_reverse_scan), K(sample_step), KPC(this));
} else {
meta_iter = iter;
}

View File

@ -72,6 +72,7 @@ int ObSSTableSecMetaIterator::open(
{
int ret = OB_SUCCESS;
bool is_meta_root = false;
bool is_ddl_mem_sstable = false;
if (IS_INIT) {
ret = OB_INIT_TWICE;
LOG_WARN("Fail to open sstable secondary meta iterator", K(ret));
@ -99,6 +100,7 @@ int ObSSTableSecMetaIterator::open(
if (OB_FAIL(ret) || is_prefetch_end_) {
} else if (sstable.is_ddl_mem_sstable()) {
is_ddl_mem_sstable = true;
const ObMicroBlockData &root_block = sstable_meta_hdl_.get_sstable_meta().get_root_info().get_block_data();
if (ObMicroBlockData::DDL_BLOCK_TREE != root_block.type_ || nullptr == root_block.buf_) {
ret = OB_ERR_UNEXPECTED;
@ -111,7 +113,12 @@ int ObSSTableSecMetaIterator::open(
true, //is_right_border,
curr_block_start_idx_,
curr_block_end_idx_))) {
LOG_WARN("locate range failed", K(ret));
if (OB_UNLIKELY(OB_BEYOND_THE_RANGE != ret)) {
LOG_WARN("locate range failed", K(ret), K(query_range));
} else {
curr_block_idx_ = curr_block_end_idx_ + 1;
ret = OB_SUCCESS; // return OB_ITER_END on get_next() for get
}
} else {
const int64_t step = max(1, sample_step);
step_cnt_ = !is_reverse_scan ? step : -step;
@ -134,7 +141,7 @@ int ObSSTableSecMetaIterator::open(
const int64_t request_col_cnt = rowkey_read_info.get_schema_rowkey_count()
+ ObMultiVersionRowkeyHelpper::get_extra_rowkey_col_cnt() + 1;
if (OB_SUCC(ret) && !is_prefetch_end_ && !is_meta_root) {
if (OB_SUCC(ret) && !is_prefetch_end_ && !is_meta_root && !is_ddl_mem_sstable) {
bool start_key_beyond_range = false;
bool end_key_beyond_range = false;
if (is_reverse_scan) {
@ -174,7 +181,7 @@ int ObSSTableSecMetaIterator::open(
}
}
if (OB_FAIL(ret)) {
if (OB_FAIL(ret) || is_ddl_mem_sstable) {
// do nothing
} else if (is_prefetch_end_) {
is_inited_ = true;

View File

@ -137,7 +137,7 @@ public:
void dec_pending_cnt();
bool is_pending() const { return ATOMIC_LOAD(&pending_cnt_) > 0; }
int wait_pending();
TO_STRING_KV(K_(is_inited), K_(ls_id), K_(tablet_id), K_(ddl_start_scn), K_(snapshot_version),
INHERIT_TO_STRING_KV("ObSSTable", ObSSTable, K_(is_inited), K_(ls_id), K_(tablet_id), K_(ddl_start_scn), K_(snapshot_version),
K_(is_freezed), K_(is_closed),
K_(last_freezed_scn), K_(min_scn), K_(max_scn), K_(freeze_scn),
K_(pending_cnt), K_(data_format_version), K_(ref_cnt),