[scn] fix implement of convert_for_tx

This commit is contained in:
obdev 2022-12-01 02:42:50 +00:00 committed by ob-robot
parent cda6fed9b5
commit 57241dad38
4 changed files with 45 additions and 5 deletions

View File

@ -354,7 +354,7 @@ int SCN::convert_for_tx(int64_t val)
int ret = OB_SUCCESS;
if (INT64_MAX == val) {
val_ = OB_MAX_SCN_TS_NS;
} else if (OB_UNLIKELY(OB_MAX_SCN_TS_NS < val || OB_MIN_SCN_TS_NS > val)) {
} else if (OB_UNLIKELY(val < 0 || OB_MAX_SCN_TS_NS < val)) {
ret = OB_INVALID_ARGUMENT;
PALF_LOG(ERROR, "invalid argument", K(val), K(lbt()));
} else {
@ -366,10 +366,10 @@ int SCN::convert_for_tx(int64_t val)
int64_t SCN::get_val_for_tx() const
{
int64_t result_val = 0;
if (OB_MAX_SCN_TS_NS == ts_ns_) {
result_val = INT64_MAX;
} else if (!is_valid()) {
if (!is_valid()) {
PALF_LOG(ERROR, "invalid SCN", K(val_));
} else if (OB_MAX_SCN_TS_NS == ts_ns_) {
result_val = INT64_MAX;
} else {
result_val = ts_ns_;
}

View File

@ -30,6 +30,5 @@ ob_unittest(test_log_config_mgr)
ob_unittest(test_clear_up_tmp_files)
ob_unittest(test_log_dir_match)
ob_unittest(test_server_log_block_mgr)
log_unittest(test_scn)
log_unittest(test_role_change_handler)
log_unittest(test_log_mode_mgr)

View File

@ -55,6 +55,7 @@ ob_unittest(test_ob_future)
ob_unittest(test_qsync_lock lock/test_qsync_lock.cpp)
ob_unittest(test_ob_occam_time_guard)
ob_unittest(test_cluster_version)
ob_unittest(test_scn)
add_subdirectory(allocator)
add_subdirectory(auto_increment)

View File

@ -110,6 +110,46 @@ TEST(TestSCN, test_scn)
EXPECT_EQ(4611686018427387903, scn_max.get_val_for_inner_table_field());
EXPECT_EQ(1, scn_base.get_val_for_inner_table_field());
//test get_val_for_tx() and get_val_for_tx()
//
scn1.reset();
scn2.reset();
EXPECT_EQ(OB_INVALID_ARGUMENT, scn1.convert_for_tx(-1));
EXPECT_EQ(OB_INVALID_ARGUMENT, scn1.convert_for_tx(INT64_MAX-1));
EXPECT_EQ(OB_INVALID_ARGUMENT, scn1.convert_for_tx(4611686018427387904));
EXPECT_EQ(OB_SUCCESS, scn1.convert_for_tx(4611686018427387903));
EXPECT_TRUE(scn1.is_max());
EXPECT_EQ(INT64_MAX, scn1.get_val_for_tx());
scn1.reset();
EXPECT_EQ(OB_SUCCESS, scn1.convert_for_tx(INT64_MAX));
EXPECT_TRUE(scn1.is_max());
EXPECT_EQ(INT64_MAX, scn1.get_val_for_tx());
EXPECT_EQ(OB_SUCCESS, scn1.convert_for_tx(0));
EXPECT_TRUE(scn1.is_min());
EXPECT_EQ(0, scn1.get_val_for_tx());
EXPECT_EQ(OB_SUCCESS, scn1.convert_for_tx(1));
EXPECT_TRUE(scn1 == SCN::base_scn());
EXPECT_EQ(1, scn1.get_val_for_tx());
EXPECT_TRUE(scn1.is_valid());
scn1.reset();
EXPECT_EQ(OB_INVALID_ARGUMENT, scn1.convert_for_inner_table_field(-1));
EXPECT_FALSE(scn1.is_valid());
scn1.reset();
EXPECT_EQ(OB_INVALID_ARGUMENT, scn1.convert_for_inner_table_field(4611686018427387904));
EXPECT_FALSE(scn1.is_valid());
EXPECT_EQ(OB_SUCCESS, scn1.convert_for_inner_table_field(4611686018427387903));
EXPECT_TRUE(scn1.is_valid());
EXPECT_EQ(4611686018427387903, scn1.get_val_for_inner_table_field());
EXPECT_EQ(OB_SUCCESS, scn1.convert_for_inner_table_field(100000));
EXPECT_TRUE(scn1.is_valid());
EXPECT_EQ(OB_SUCCESS, scn2.convert_for_inner_table_field(90000));
EXPECT_TRUE(scn2.is_valid());
// Test operator <
EXPECT_FALSE(scn1 == scn2);
EXPECT_TRUE(scn1 == scn3);