cherry-pick omitted fixs to open-source branch

This commit is contained in:
obdev
2021-07-19 23:12:15 +08:00
committed by wangzelin.wzl
parent c949c5e01f
commit ae0ace666f
51 changed files with 141004 additions and 141679 deletions

View File

@ -2245,8 +2245,235 @@ TEST_F(TestMicroBlockRowScanner, test_bug)
ASSERT_TRUE(res_iter.equals(scanner_iter, false));
}
} // namespace unittest
} // namespace oceanbase
TEST_F(TestMicroBlockRowScanner, test_bug2)
{
const int64_t rowkey_cnt = 4;
const int64_t micro_cnt = 1;
const char *micro_data[micro_cnt];
micro_data[0] =
"bigint var bigint bigint bigint bigint flag multi_version_row_flag trans_id\n"
"-10 var1 -1 -1 9 NOP EXIST L trans_id_0\n"
"-2 var1 -4 -1 5 NOP EXIST CL trans_id_0\n"
"-1 var1 MAGIC MAGIC NOP NOP EXIST LM trans_id_0\n"
"0 var1 MAGIC MAGIC NOP NOP EXIST LM trans_id_0\n"
"1 var1 MIN -1 9 NOP EXIST U trans_id_1\n"
"1 var1 MAGIC MAGIC NOP NOP EXIST LM trans_id_0\n"
"2 var1 MAGIC MAGIC NOP NOP EXIST LM trans_id_0\n"
"3 var1 MAGIC MAGIC NOP NOP EXIST LM trans_id_0\n"
"4 var1 MIN -9 1 NOP EXIST U trans_id_2\n"
"4 var1 MAGIC MAGIC NOP NOP EXIST LM trans_id_0\n"
"5 var1 MAGIC MAGIC NOP NOP EXIST LM trans_id_0\n"
"6 var1 MAGIC MAGIC NOP NOP EXIST LM trans_id_0\n"
"7 var1 MAGIC MAGIC NOP NOP EXIST LM trans_id_0\n"
"8 var1 MIN -9 3 NOP EXIST U trans_id_2\n"
"8 var1 MAGIC MAGIC NOP NOP EXIST LM trans_id_0\n"
"10 var1 -1 -1 9 NOP EXIST L trans_id_0\n";
prepare_data(micro_data, 1, rowkey_cnt, 9);
ObMultiVersionMicroBlockRowScanner m_scanner;
ObVersionRange trans_version_range;
ObMockIterator micro_iter;
ObMockIterator res_iter;
ObMicroBlockData block_data;
ObMicroBlockData payload_data;
common::ObExtStoreRange range;
common::ObExtStoreRange new_range;
ObMockIterator scanner_iter;
// minor
trans_version_range.base_version_ = 0;
trans_version_range.snapshot_version_ = 100;
trans_version_range.multi_version_start_ = 1;
prepare_query_param(trans_version_range, true, false);
const char var1[] = "var1";
ObObj start_val[2];
ObObj end_val[2];
start_val[0].set_int(1);
start_val[1].set_varchar(var1, 4);
start_val[1].set_collation_type(CS_TYPE_UTF8MB4_GENERAL_CI);
end_val[0].set_int(8);
end_val[1].set_varchar(var1, 4);
end_val[1].set_collation_type(CS_TYPE_UTF8MB4_GENERAL_CI);
ObStoreRowkey start_key(start_val, 2);
ObStoreRowkey end_key(end_val, 2);
range.get_range().table_id_ = combine_id(1, 3001);
range.get_range().start_key_ = start_key;
range.get_range().end_key_ = end_key;
range.get_range().set_right_closed();
range.get_range().set_left_closed();
OK(ObVersionStoreRangeConversionHelper::range_to_multi_version_range(range, trans_version_range, allocator_, new_range));
STORAGE_LOG(INFO, "chaser debug range", K(range), K(new_range));
test_trans_part_ctx_.clear_all();
int ret = OB_SUCCESS;
if (OB_FAIL(test_trans_part_ctx_.add_transaction_status(transaction::ObTransTableStatusType::COMMIT, 10))) {
STORAGE_LOG(ERROR, "add transaction status failed", K(ret));
} else if (OB_FAIL(test_trans_part_ctx_.add_transaction_status(transaction::ObTransTableStatusType::COMMIT, 10))) {
STORAGE_LOG(ERROR, "add transaction status failed", K(ret));
}
OK(m_scanner.init(param_, context_, &sstable_));
OK(m_scanner.set_range(new_range.get_range()));
const char *result1 =
"bigint var bigint bigint flag\n"
//"-2 var1 5 NOP EXIST\n"
"1 var1 9 NOP EXIST\n"
"4 var1 1 NOP EXIST\n"
"8 var1 3 NOP EXIST\n";
const ObStoreRow *row = NULL;
bool is_left_border = true;
bool is_right_border = true;
for (int64_t i = 0; i < micro_cnt; ++i) {
ret = OB_SUCCESS;
micro_iter.reset();
OK(micro_iter.from(micro_data[i]));
build_micro_block_data(micro_iter, block_data, payload_data, end_key);
MacroBlockId macro_id(0, 0, 1, ObStoreFileSystem::RESERVED_MACRO_BLOCK_INDEX);
ObFullMacroBlockMeta full_meta;
OK(sstable_.get_meta(macro_id, full_meta));
const_cast<oceanbase::blocksstable::ObMacroBlockMetaV2 *>(full_meta.meta_)->contain_uncommitted_row_ = true;
OK(m_scanner.open(macro_id, full_meta, payload_data, is_left_border, is_right_border)) << "i: " << i;
while (OB_SUCCESS == ret) {
ret = m_scanner.get_next_row(row);
if (OB_SUCCESS == ret) {
ASSERT_TRUE(NULL != row) << "i: " << i;
OK(scanner_iter.add_row(const_cast<ObStoreRow *>(row)));
STORAGE_LOG(INFO, "test", "this row", to_cstring(*row));
} else if (OB_ITER_END != ret) {
ASSERT_EQ(OB_SUCCESS, ret);
}
}
}
res_iter.reset();
OK(res_iter.from(result1));
ASSERT_TRUE(res_iter.equals(scanner_iter, false));
scanner_iter.reset();
m_scanner.reset();
context_.query_flag_.scan_order_ = common::ObQueryFlag::Reverse;
OK(m_scanner.init(param_, context_, &sstable_));
OK(m_scanner.set_range(new_range.get_range()));
const char *result2 =
"bigint var bigint bigint flag\n"
"8 var1 3 NOP EXIST\n"
"4 var1 1 NOP EXIST\n"
"1 var1 9 NOP EXIST\n";
//"-2 var1 5 NOP EXIST\n";
for (int64_t i = 0; i < micro_cnt; ++i) {
ret = OB_SUCCESS;
micro_iter.reset();
OK(micro_iter.from(micro_data[i]));
build_micro_block_data(micro_iter, block_data, payload_data, end_key);
MacroBlockId macro_id(0, 0, 1, ObStoreFileSystem::RESERVED_MACRO_BLOCK_INDEX);
ObFullMacroBlockMeta full_meta;
OK(sstable_.get_meta(macro_id, full_meta));
const_cast<oceanbase::blocksstable::ObMacroBlockMetaV2 *>(full_meta.meta_)->contain_uncommitted_row_ = true;
OK(m_scanner.open(macro_id, full_meta, payload_data, is_left_border, is_right_border)) << "i: " << i;
while (OB_SUCCESS == ret) {
ret = m_scanner.get_next_row(row);
if (OB_SUCCESS == ret) {
ASSERT_TRUE(NULL != row) << "i: " << i;
OK(scanner_iter.add_row(const_cast<ObStoreRow *>(row)));
STORAGE_LOG(INFO, "test", "this row", to_cstring(*row));
} else if (OB_ITER_END != ret) {
ASSERT_EQ(OB_SUCCESS, ret);
}
}
}
res_iter.reset();
OK(res_iter.from(result2));
ASSERT_TRUE(res_iter.equals(scanner_iter, false));
scanner_iter.reset();
start_val[0].set_int(-2);
end_val[0].set_int(7);
new_range.reset();
context_.query_flag_.scan_order_ = common::ObQueryFlag::Forward;
OK(ObVersionStoreRangeConversionHelper::range_to_multi_version_range(range, trans_version_range, allocator_, new_range));
STORAGE_LOG(INFO, "chaser debug range", K(range), K(new_range));
const char *result3 =
"bigint var bigint bigint flag\n"
"-2 var1 5 NOP EXIST\n"
"1 var1 9 NOP EXIST\n"
"4 var1 1 NOP EXIST\n";
m_scanner.reset();
OK(m_scanner.init(param_, context_, &sstable_));
OK(m_scanner.set_range(new_range.get_range()));
for (int64_t i = 0; i < micro_cnt; ++i) {
ret = OB_SUCCESS;
micro_iter.reset();
OK(micro_iter.from(micro_data[i]));
build_micro_block_data(micro_iter, block_data, payload_data, end_key);
MacroBlockId macro_id(0, 0, 1, ObStoreFileSystem::RESERVED_MACRO_BLOCK_INDEX);
ObFullMacroBlockMeta full_meta;
OK(sstable_.get_meta(macro_id, full_meta));
const_cast<oceanbase::blocksstable::ObMacroBlockMetaV2 *>(full_meta.meta_)->contain_uncommitted_row_ = true;
OK(m_scanner.open(macro_id, full_meta, payload_data, is_left_border, is_right_border)) << "i: " << i;
while (OB_SUCCESS == ret) {
ret = m_scanner.get_next_row(row);
if (OB_SUCCESS == ret) {
ASSERT_TRUE(NULL != row) << "i: " << i;
OK(scanner_iter.add_row(const_cast<ObStoreRow *>(row)));
STORAGE_LOG(INFO, "test", "this row", to_cstring(*row));
} else if (OB_ITER_END != ret) {
ASSERT_EQ(OB_SUCCESS, ret);
}
}
}
res_iter.reset();
OK(res_iter.from(result3));
ASSERT_TRUE(res_iter.equals(scanner_iter, false));
scanner_iter.reset();
start_val[0].set_int(1);
end_val[0].set_int(8);
range.get_range().set_left_open();
range.get_range().set_right_open();
new_range.reset();
context_.query_flag_.scan_order_ = common::ObQueryFlag::Forward;
OK(ObVersionStoreRangeConversionHelper::range_to_multi_version_range(range, trans_version_range, allocator_, new_range));
STORAGE_LOG(INFO, "chaser debug range", K(range), K(new_range));
const char *result4 =
"bigint var bigint bigint flag\n"
"4 var1 1 NOP EXIST\n";
m_scanner.reset();
OK(m_scanner.init(param_, context_, &sstable_));
OK(m_scanner.set_range(new_range.get_range()));
for (int64_t i = 0; i < micro_cnt; ++i) {
ret = OB_SUCCESS;
micro_iter.reset();
OK(micro_iter.from(micro_data[i]));
build_micro_block_data(micro_iter, block_data, payload_data, end_key);
MacroBlockId macro_id(0, 0, 1, ObStoreFileSystem::RESERVED_MACRO_BLOCK_INDEX);
ObFullMacroBlockMeta full_meta;
OK(sstable_.get_meta(macro_id, full_meta));
const_cast<oceanbase::blocksstable::ObMacroBlockMetaV2 *>(full_meta.meta_)->contain_uncommitted_row_ = true;
OK(m_scanner.open(macro_id, full_meta, payload_data, is_left_border, is_right_border)) << "i: " << i;
while (OB_SUCCESS == ret) {
ret = m_scanner.get_next_row(row);
if (OB_SUCCESS == ret) {
ASSERT_TRUE(NULL != row) << "i: " << i;
OK(scanner_iter.add_row(const_cast<ObStoreRow *>(row)));
STORAGE_LOG(INFO, "test", "this row", to_cstring(*row));
} else if (OB_ITER_END != ret) {
ASSERT_EQ(OB_SUCCESS, ret);
}
}
}
res_iter.reset();
OK(res_iter.from(result4));
ASSERT_TRUE(res_iter.equals(scanner_iter, false));
}
}
}
int main(int argc, char** argv)
{