提交 74e3e4cb 编写于 作者: C chaser-ch 提交者: LINGuanRen

fix reverse scan with magic row problem

上级 bdf2dc1d
......@@ -418,16 +418,15 @@ int ObVersionStoreRangeConversionHelper::store_rowkey_to_multi_version_range(
COMMON_LOG(WARN, "version_range is not valid", K(ret), K(version_range));
} else if (OB_FAIL(build_multi_version_store_rowkey(src_rowkey.get_store_rowkey(),
//-version_range.snapshot_version_,
-INT64_MAX,
true, // min_value
allocator,
multi_version_range.get_range().get_start_key()))) {
COMMON_LOG(WARN, "build multi version store rowkey failed", K(ret), K(src_rowkey), K(version_range));
} else if (OB_FAIL(build_multi_version_store_rowkey(src_rowkey.get_store_rowkey(),
ObVersionRange::MAX_VERSION,
allocator,
multi_version_range.get_range().get_end_key()))) {
COMMON_LOG(WARN, "build multi version store rowkey failed",
K(ret), K(src_rowkey), K(version_range));
false, // min_value
allocator,
multi_version_range.get_range().get_end_key()))) {
COMMON_LOG(WARN, "build multi version store rowkey failed", K(ret), K(src_rowkey), K(version_range));
} else if (OB_FAIL(multi_version_range.to_collation_free_range_on_demand_and_cutoff_range(allocator))) {
COMMON_LOG(WARN, "fail to get colllation free rowkey and range cutoff", K(ret));
} else {
......@@ -455,15 +454,15 @@ int ObVersionStoreRangeConversionHelper::range_to_multi_version_range(
ret = OB_INVALID_ARGUMENT;
COMMON_LOG(WARN, "version_range is not valid", K(ret), K(version_range));
} else if (OB_FAIL(build_multi_version_store_rowkey(src_range.get_range().get_start_key(),
include_start ? -INT64_MAX : ObVersionRange::MAX_VERSION,
allocator, multi_version_range.get_range().get_start_key()))) {
COMMON_LOG(WARN, "build multi version store rowkey failed",
K(ret), K(src_range), K(version_range));
include_start,
allocator,
multi_version_range.get_range().get_start_key()))) {
COMMON_LOG(WARN, "build multi version store rowkey failed", K(ret), K(src_range), K(version_range));
} else if (OB_FAIL(build_multi_version_store_rowkey(src_range.get_range().get_end_key(),
include_end ? ObVersionRange::MAX_VERSION : - ObVersionRange::MAX_VERSION,
allocator, multi_version_range.get_range().get_end_key()))) {
COMMON_LOG(WARN, "build multi version store rowkey failed",
K(ret), K(src_range), K(version_range));
!include_end,
allocator,
multi_version_range.get_range().get_end_key()))) {
COMMON_LOG(WARN, "build multi version store rowkey failed", K(ret), K(src_range), K(version_range));
} else if (OB_FAIL(multi_version_range.to_collation_free_range_on_demand_and_cutoff_range(allocator))) {
COMMON_LOG(WARN, "fail to get collation free rowkey", K(ret));
} else {
......@@ -482,8 +481,8 @@ int ObVersionStoreRangeConversionHelper::range_to_multi_version_range(
return ret;
}
int ObVersionStoreRangeConversionHelper::build_multi_version_store_rowkey(const ObStoreRowkey& store_rowkey,
const int64_t trans_version, ObIAllocator& allocator, ObStoreRowkey& multi_version_store_rowkey)
int ObVersionStoreRangeConversionHelper::build_multi_version_store_rowkey(const ObStoreRowkey &store_rowkey,
const bool min_value, ObIAllocator &allocator, ObStoreRowkey &multi_version_store_rowkey)
{
int ret = OB_SUCCESS;
......@@ -509,7 +508,11 @@ int ObVersionStoreRangeConversionHelper::build_multi_version_store_rowkey(const
cells[i] = store_rowkey.get_obj_ptr()[i];
}
// FIXME: hard coding
cells[i].set_int(trans_version);
if (min_value) {
cells[i].set_min_value();
} else {
cells[i].set_max_value();
}
multi_version_store_rowkey.assign(cells, cell_cnt);
}
}
......
......@@ -409,8 +409,8 @@ public:
ObIAllocator& allocator, ObExtStoreRange& multi_version_range);
private:
static int build_multi_version_store_rowkey(const ObStoreRowkey& rowkey, const int64_t trans_version,
ObIAllocator& allocator, ObStoreRowkey& multi_version_rowkey);
static int build_multi_version_store_rowkey(
const ObStoreRowkey &rowkey, const bool min_value, ObIAllocator &allocator, ObStoreRowkey &multi_version_rowkey);
};
} // end namespace common
......
......@@ -2609,16 +2609,168 @@ TEST_F(TestMultiVersionSSTableSingleScan, test_memleak)
scanner->~ObStoreRowIterator();
}
TEST_F(TestMultiVersionSSTableSingleScan, test_reverse)
{
const int64_t rowkey_cnt = 4;
const char *micro_data[5];
micro_data[0] = "bigint var bigint bigint bigint bigint flag multi_version_row_flag\n"
"0 var1 -9 0 7 NOP EXIST C\n"
"0 var1 -7 0 6 5 EXIST C\n"
"0 var1 9223372036854775807 9223372036854775807 NOP NOP EXIST LM\n";
micro_data[1] = "bigint var bigint bigint bigint bigint flag multi_version_row_flag\n"
"1 var1 -8 0 NOP 2 EXIST C\n"
"1 var1 -2 0 2 NOP EXIST L\n"
"2 var1 -9 0 7 NOP EXIST C\n"
"2 var1 -7 0 6 5 EXIST C\n"
"2 var1 9223372036854775807 9223372036854775807 NOP NOP EXIST LM\n";
micro_data[2] = "bigint var bigint bigint bigint bigint flag multi_version_row_flag\n"
"3 var1 -6 0 6 1 EXIST C\n"
"3 var1 9223372036854775807 9223372036854775807 NOP NOP EXIST LM\n";
micro_data[3] = "bigint var bigint bigint bigint bigint flag multi_version_row_flag\n"
"4 var1 -3 0 5 2 EXIST C\n"
"4 var1 -2 0 5 1 EXIST C\n"
"4 var1 -1 0 NOP NOP EXIST LM\n"
"5 var1 -2 0 5 1 EXIST C\n"
"5 var1 -1 0 4 3 EXIST L\n";
micro_data[4] = "bigint var bigint bigint bigint bigint flag multi_version_row_flag\n"
"6 var1 -3 0 5 2 EXIST C\n"
"6 var1 -2 0 5 1 EXIST C\n"
"6 var1 -1 0 4 3 EXIST L\n";
prepare_data_start(micro_data, rowkey_cnt, 10, "none", FLAT_ROW_STORE, 0);
prepare_one_macro(micro_data, 2, 10, nullptr, nullptr, true);
prepare_one_macro(&micro_data[2], 1, 10, nullptr, nullptr, true);
prepare_one_macro(&micro_data[3], 2, 10, nullptr, nullptr, true);
// prepare_one_macro(&micro_data[2], 1, 10, nullptr, nullptr, true);
prepare_data_end();
ObMockIterator res_iter;
ObStoreRowIterator *scanner = NULL;
ObExtStoreRange range;
const char *result1 = "bigint var bigint bigint flag multi_version_row_flag\n"
"6 var1 5 2 EXIST N\n"
"5 var1 5 1 EXIST N\n"
"4 var1 5 2 EXIST N\n"
"3 var1 6 1 EXIST N\n";
const char *rowkey1 = "bigint var bigint flag multi_version_row_flag\n"
"2 var1 9223372036854775807 EXIST N\n";
ObMockIterator rowkey_iter;
ObExtStoreRowkey ext_rowkey;
const ObStoreRow *row = NULL;
rowkey_iter.reset();
OK(rowkey_iter.from(rowkey1));
OK(rowkey_iter.get_row(0, row));
ASSERT_TRUE(NULL != row);
range.get_range().set_whole_range();
range.get_range().start_key_.assign(row->row_val_.cells_, rowkey_cnt - 2);
range.get_range().set_left_open();
OK(range.to_collation_free_range_on_demand_and_cutoff_range(stmt_allocator_));
ObVersionRange trans_version_range;
trans_version_range.base_version_ = 0;
trans_version_range.multi_version_start_ = 0;
trans_version_range.snapshot_version_ = 100;
prepare_query_param(trans_version_range, false, false, true);
res_iter.reset();
OK(sstable_.scan(param_, context_, range, scanner));
OK(res_iter.from(result1));
ASSERT_TRUE(res_iter.equals(*scanner));
scanner->~ObStoreRowIterator();
}
TEST_F(TestMultiVersionSSTableSingleScan, test_reverse2)
{
const int64_t rowkey_cnt = 4;
const char *micro_data[5];
micro_data[0] = "bigint var bigint bigint bigint bigint flag multi_version_row_flag\n"
"0 var1 -9 0 7 NOP EXIST C\n"
"0 var1 -7 0 6 5 EXIST C\n"
"0 var1 9223372036854775807 9223372036854775807 NOP NOP EXIST LM\n";
micro_data[1] = "bigint var bigint bigint bigint bigint flag multi_version_row_flag\n"
"1 var1 -8 0 NOP 2 EXIST C\n"
"1 var1 -2 0 2 NOP EXIST L\n"
"2 var1 9223372036854775807 9223372036854775807 NOP NOP EXIST LM\n";
micro_data[2] = "bigint var bigint bigint bigint bigint flag multi_version_row_flag\n"
"3 var1 -6 0 6 1 EXIST C\n"
"3 var1 9223372036854775807 9223372036854775807 NOP NOP EXIST LM\n";
micro_data[3] = "bigint var bigint bigint bigint bigint flag multi_version_row_flag\n"
"4 var1 -3 0 5 2 EXIST C\n"
"4 var1 -2 0 5 1 EXIST C\n"
"4 var1 -1 0 NOP NOP EXIST LM\n"
"5 var1 -2 0 5 1 EXIST C\n"
"5 var1 -1 0 4 3 EXIST L\n";
micro_data[4] = "bigint var bigint bigint bigint bigint flag multi_version_row_flag\n"
"6 var1 -3 0 5 2 EXIST C\n"
"6 var1 -2 0 5 1 EXIST C\n"
"6 var1 -1 0 4 3 EXIST L\n";
prepare_data_start(micro_data, rowkey_cnt, 10, "none", FLAT_ROW_STORE, 0);
prepare_one_macro(micro_data, 2, 10, nullptr, nullptr, true);
prepare_one_macro(&micro_data[2], 1, 10, nullptr, nullptr, true);
prepare_one_macro(&micro_data[3], 2, 10, nullptr, nullptr, true);
// prepare_one_macro(&micro_data[2], 1, 10, nullptr, nullptr, true);
prepare_data_end();
ObMockIterator res_iter;
ObStoreRowIterator *scanner = NULL;
ObExtStoreRange range;
const char *result1 = "bigint var bigint bigint flag multi_version_row_flag\n"
"6 var1 5 2 EXIST N\n"
"5 var1 5 1 EXIST N\n"
"4 var1 5 2 EXIST N\n"
"3 var1 6 1 EXIST N\n";
const char *rowkey1 = "bigint var bigint flag multi_version_row_flag\n"
"1 var1 9223372036854775807 EXIST N\n";
ObMockIterator rowkey_iter;
ObExtStoreRowkey ext_rowkey;
const ObStoreRow *row = NULL;
rowkey_iter.reset();
OK(rowkey_iter.from(rowkey1));
OK(rowkey_iter.get_row(0, row));
ASSERT_TRUE(NULL != row);
range.get_range().set_whole_range();
range.get_range().start_key_.assign(row->row_val_.cells_, rowkey_cnt - 2);
range.get_range().set_left_open();
OK(range.to_collation_free_range_on_demand_and_cutoff_range(stmt_allocator_));
ObVersionRange trans_version_range;
trans_version_range.base_version_ = 0;
trans_version_range.multi_version_start_ = 0;
trans_version_range.snapshot_version_ = 100;
prepare_query_param(trans_version_range, false, false, true);
res_iter.reset();
OK(sstable_.scan(param_, context_, range, scanner));
OK(res_iter.from(result1));
ASSERT_TRUE(res_iter.equals(*scanner));
scanner->~ObStoreRowIterator();
}
} // namespace unittest
} // namespace oceanbase
int main(int argc, char** argv)
{
GCONF._enable_sparse_row = true;
// GCONF._enable_sparse_row = true;
system("rm -rf test_multi_version_sstable_single_scan.log");
OB_LOGGER.set_file_name("test_multi_version_sstable_single_scan.log");
STORAGE_LOG(INFO, "begin unittest: test_multi_version_sstable_single_scan");
oceanbase::common::ObLogger::get_logger().set_log_level("INFO");
oceanbase::common::ObLogger::get_logger().set_log_level("DEBUG");
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册