fix reverse scan with magic row problem
This commit is contained in:
33
deps/oblib/src/common/ob_store_range.cpp
vendored
33
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));
|
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(),
|
} else if (OB_FAIL(build_multi_version_store_rowkey(src_rowkey.get_store_rowkey(),
|
||||||
//-version_range.snapshot_version_,
|
//-version_range.snapshot_version_,
|
||||||
-INT64_MAX,
|
true, // min_value
|
||||||
allocator,
|
allocator,
|
||||||
multi_version_range.get_range().get_start_key()))) {
|
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));
|
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(),
|
} else if (OB_FAIL(build_multi_version_store_rowkey(src_rowkey.get_store_rowkey(),
|
||||||
ObVersionRange::MAX_VERSION,
|
false, // min_value
|
||||||
allocator,
|
allocator,
|
||||||
multi_version_range.get_range().get_end_key()))) {
|
multi_version_range.get_range().get_end_key()))) {
|
||||||
COMMON_LOG(WARN, "build multi version store rowkey failed",
|
COMMON_LOG(WARN, "build multi version store rowkey failed", K(ret), K(src_rowkey), K(version_range));
|
||||||
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))) {
|
} 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));
|
COMMON_LOG(WARN, "fail to get colllation free rowkey and range cutoff", K(ret));
|
||||||
} else {
|
} else {
|
||||||
@ -455,15 +454,15 @@ int ObVersionStoreRangeConversionHelper::range_to_multi_version_range(
|
|||||||
ret = OB_INVALID_ARGUMENT;
|
ret = OB_INVALID_ARGUMENT;
|
||||||
COMMON_LOG(WARN, "version_range is not valid", K(ret), K(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_range.get_range().get_start_key(),
|
} else if (OB_FAIL(build_multi_version_store_rowkey(src_range.get_range().get_start_key(),
|
||||||
include_start ? -INT64_MAX : ObVersionRange::MAX_VERSION,
|
include_start,
|
||||||
allocator, multi_version_range.get_range().get_start_key()))) {
|
allocator,
|
||||||
COMMON_LOG(WARN, "build multi version store rowkey failed",
|
multi_version_range.get_range().get_start_key()))) {
|
||||||
K(ret), K(src_range), K(version_range));
|
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(),
|
} else if (OB_FAIL(build_multi_version_store_rowkey(src_range.get_range().get_end_key(),
|
||||||
include_end ? ObVersionRange::MAX_VERSION : - ObVersionRange::MAX_VERSION,
|
!include_end,
|
||||||
allocator, multi_version_range.get_range().get_end_key()))) {
|
allocator,
|
||||||
COMMON_LOG(WARN, "build multi version store rowkey failed",
|
multi_version_range.get_range().get_end_key()))) {
|
||||||
K(ret), K(src_range), K(version_range));
|
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))) {
|
} 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));
|
COMMON_LOG(WARN, "fail to get collation free rowkey", K(ret));
|
||||||
} else {
|
} else {
|
||||||
@ -482,8 +481,8 @@ int ObVersionStoreRangeConversionHelper::range_to_multi_version_range(
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ObVersionStoreRangeConversionHelper::build_multi_version_store_rowkey(const ObStoreRowkey& store_rowkey,
|
int ObVersionStoreRangeConversionHelper::build_multi_version_store_rowkey(const ObStoreRowkey &store_rowkey,
|
||||||
const int64_t trans_version, ObIAllocator& allocator, ObStoreRowkey& multi_version_store_rowkey)
|
const bool min_value, ObIAllocator &allocator, ObStoreRowkey &multi_version_store_rowkey)
|
||||||
{
|
{
|
||||||
int ret = OB_SUCCESS;
|
int ret = OB_SUCCESS;
|
||||||
|
|
||||||
@ -509,7 +508,11 @@ int ObVersionStoreRangeConversionHelper::build_multi_version_store_rowkey(const
|
|||||||
cells[i] = store_rowkey.get_obj_ptr()[i];
|
cells[i] = store_rowkey.get_obj_ptr()[i];
|
||||||
}
|
}
|
||||||
// FIXME: hard coding
|
// 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);
|
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);
|
ObIAllocator& allocator, ObExtStoreRange& multi_version_range);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static int build_multi_version_store_rowkey(const ObStoreRowkey& rowkey, const int64_t trans_version,
|
static int build_multi_version_store_rowkey(
|
||||||
ObIAllocator& allocator, ObStoreRowkey& multi_version_rowkey);
|
const ObStoreRowkey &rowkey, const bool min_value, ObIAllocator &allocator, ObStoreRowkey &multi_version_rowkey);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end namespace common
|
} // end namespace common
|
||||||
|
|||||||
@ -2609,16 +2609,168 @@ TEST_F(TestMultiVersionSSTableSingleScan, test_memleak)
|
|||||||
scanner->~ObStoreRowIterator();
|
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 unittest
|
||||||
} // namespace oceanbase
|
} // namespace oceanbase
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
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");
|
system("rm -rf test_multi_version_sstable_single_scan.log");
|
||||||
OB_LOGGER.set_file_name("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");
|
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);
|
testing::InitGoogleTest(&argc, argv);
|
||||||
return RUN_ALL_TESTS();
|
return RUN_ALL_TESTS();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user