fix reverse scan with magic row problem
This commit is contained in:
parent
bdf2dc1ddb
commit
74e3e4cb0b
37
deps/oblib/src/common/ob_store_range.cpp
vendored
37
deps/oblib/src/common/ob_store_range.cpp
vendored
@ -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);
|
||||
}
|
||||
}
|
||||
|
4
deps/oblib/src/common/ob_store_range.h
vendored
4
deps/oblib/src/common/ob_store_range.h
vendored
@ -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(µ_data[2], 1, 10, nullptr, nullptr, true);
|
||||
prepare_one_macro(µ_data[3], 2, 10, nullptr, nullptr, true);
|
||||
// prepare_one_macro(µ_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(µ_data[2], 1, 10, nullptr, nullptr, true);
|
||||
prepare_one_macro(µ_data[3], 2, 10, nullptr, nullptr, true);
|
||||
// prepare_one_macro(µ_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();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user