[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; int ret = OB_SUCCESS;
if (INT64_MAX == val) { if (INT64_MAX == val) {
val_ = OB_MAX_SCN_TS_NS; 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; ret = OB_INVALID_ARGUMENT;
PALF_LOG(ERROR, "invalid argument", K(val), K(lbt())); PALF_LOG(ERROR, "invalid argument", K(val), K(lbt()));
} else { } else {
@ -366,10 +366,10 @@ int SCN::convert_for_tx(int64_t val)
int64_t SCN::get_val_for_tx() const int64_t SCN::get_val_for_tx() const
{ {
int64_t result_val = 0; int64_t result_val = 0;
if (OB_MAX_SCN_TS_NS == ts_ns_) { if (!is_valid()) {
result_val = INT64_MAX;
} else if (!is_valid()) {
PALF_LOG(ERROR, "invalid SCN", K(val_)); PALF_LOG(ERROR, "invalid SCN", K(val_));
} else if (OB_MAX_SCN_TS_NS == ts_ns_) {
result_val = INT64_MAX;
} else { } else {
result_val = ts_ns_; 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_clear_up_tmp_files)
ob_unittest(test_log_dir_match) ob_unittest(test_log_dir_match)
ob_unittest(test_server_log_block_mgr) ob_unittest(test_server_log_block_mgr)
log_unittest(test_scn)
log_unittest(test_role_change_handler) log_unittest(test_role_change_handler)
log_unittest(test_log_mode_mgr) 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_qsync_lock lock/test_qsync_lock.cpp)
ob_unittest(test_ob_occam_time_guard) ob_unittest(test_ob_occam_time_guard)
ob_unittest(test_cluster_version) ob_unittest(test_cluster_version)
ob_unittest(test_scn)
add_subdirectory(allocator) add_subdirectory(allocator)
add_subdirectory(auto_increment) 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(4611686018427387903, scn_max.get_val_for_inner_table_field());
EXPECT_EQ(1, scn_base.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 < // Test operator <
EXPECT_FALSE(scn1 == scn2); EXPECT_FALSE(scn1 == scn2);
EXPECT_TRUE(scn1 == scn3); EXPECT_TRUE(scn1 == scn3);