1030 lines
		
	
	
		
			36 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			1030 lines
		
	
	
		
			36 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /**
 | |
|  * Copyright (c) 2021 OceanBase
 | |
|  * OceanBase CE is licensed under Mulan PubL v2.
 | |
|  * You can use this software according to the terms and conditions of the Mulan PubL v2.
 | |
|  * You may obtain a copy of Mulan PubL v2 at:
 | |
|  *          http://license.coscl.org.cn/MulanPubL-2.0
 | |
|  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 | |
|  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 | |
|  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 | |
|  * See the Mulan PubL v2 for more details.
 | |
|  */
 | |
| 
 | |
| #include "storage/transaction/ob_trans_log.h"
 | |
| #include "storage/transaction/ob_trans_ctx.h"
 | |
| #include <gtest/gtest.h>
 | |
| #include "share/ob_errno.h"
 | |
| #include "lib/oblog/ob_log.h"
 | |
| #include "common/ob_partition_key.h"
 | |
| 
 | |
| namespace oceanbase {
 | |
| using namespace common;
 | |
| using namespace transaction;
 | |
| using namespace storage;
 | |
| namespace unittest {
 | |
| class TestObTransLog : public ::testing::Test {
 | |
| public:
 | |
|   virtual void SetUp()
 | |
|   {}
 | |
|   virtual void TearDown()
 | |
|   {}
 | |
| 
 | |
| public:
 | |
|   static const char* LOCAL_IP;
 | |
|   static const int32_t PORT = 8080;
 | |
|   static const ObAddr::VER IP_TYPE = ObAddr::IPV4;
 | |
| 
 | |
|   static const int64_t VALID_TABLE_ID = 1;
 | |
|   static const int32_t VALID_PARTITION_ID = 1;
 | |
|   static const int32_t VALID_PARTITION_COUNT = 100;
 | |
| };
 | |
| const char* TestObTransLog::LOCAL_IP = "127.0.0.1";
 | |
| const int64_t TIME_OUT = 1;
 | |
| 
 | |
| class FakeObTransLog : public ObTransLog {
 | |
| public:
 | |
|   virtual int replace_tenant_id(const uint64_t tenant_id) override
 | |
|   {
 | |
|     (void)ObTransLog::inner_replace_tenant_id(tenant_id);
 | |
|     return OB_SUCCESS;
 | |
|   }
 | |
| };
 | |
| 
 | |
| ////////////////////test for ObTransLog///////////////////
 | |
| // test the init of ObTransLog
 | |
| TEST_F(TestObTransLog, trans_log_init_invalid)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
|   // invalid parameters
 | |
|   ObTransID trans_id;
 | |
|   ObPartitionKey partition_key;
 | |
|   FakeObTransLog trans_log;
 | |
|   int64_t log_type = OB_LOG_TRANS_REDO;
 | |
|   const uint64_t cluster_id = 1000;
 | |
|   EXPECT_EQ(OB_INVALID_ARGUMENT, trans_log.init(log_type, partition_key, trans_id, cluster_id));
 | |
| 
 | |
|   // create an object of ObTtransID
 | |
|   ObAddr observer(TestObTransLog::IP_TYPE, TestObTransLog::LOCAL_IP, TestObTransLog::PORT);
 | |
|   trans_id = ObTransID(observer);
 | |
|   partition_key = ObPartitionKey(VALID_TABLE_ID, VALID_PARTITION_ID, VALID_PARTITION_COUNT);
 | |
| 
 | |
|   EXPECT_EQ(OB_SUCCESS, trans_log.init(log_type, partition_key, trans_id, cluster_id));
 | |
|   EXPECT_TRUE(trans_log.is_valid());
 | |
| }
 | |
| 
 | |
| // test the serialization and deserialization of ObTransLog
 | |
| TEST_F(TestObTransLog, trans_log_encode_decode)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
|   int64_t log_type = OB_LOG_TRANS_REDO;
 | |
|   FakeObTransLog trans_log;
 | |
|   const uint64_t cluster_id = 1000;
 | |
|   ObAddr observer(TestObTransLog::IP_TYPE, TestObTransLog::LOCAL_IP, TestObTransLog::PORT);
 | |
|   ObTransID trans_id(observer);
 | |
|   ObPartitionKey partition_key(VALID_TABLE_ID, VALID_PARTITION_ID, VALID_PARTITION_COUNT);
 | |
|   ASSERT_EQ(OB_SUCCESS, trans_log.init(log_type, partition_key, trans_id, cluster_id));
 | |
|   EXPECT_TRUE(trans_log.is_valid());
 | |
| 
 | |
|   // serialization of ObTransLog
 | |
|   int64_t pos = 0;
 | |
|   const int64_t BUFFER_SIZE = 10240;
 | |
|   char buffer[BUFFER_SIZE];
 | |
|   ASSERT_EQ(OB_SUCCESS, trans_log.serialize(buffer, BUFFER_SIZE, pos));
 | |
| 
 | |
|   // deserialization of ObTransLog
 | |
|   FakeObTransLog trans_log1;
 | |
|   int64_t start_index = 0;
 | |
|   ASSERT_EQ(OB_SUCCESS, trans_log1.deserialize(buffer, pos, start_index));
 | |
|   EXPECT_TRUE(trans_log1.is_valid());
 | |
|   // test the consistency
 | |
|   EXPECT_EQ(trans_log.get_log_type(), trans_log1.get_log_type());
 | |
|   EXPECT_EQ(trans_log.get_trans_id(), trans_log1.get_trans_id());
 | |
|   EXPECT_EQ(trans_log.get_partition(), trans_log1.get_partition());
 | |
|   EXPECT_EQ(trans_log.get_cluster_id(), trans_log1.get_cluster_id());
 | |
| }
 | |
| // test the init of ObTransMutator
 | |
| TEST_F(TestObTransLog, trans_mutator_init)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
|   ObTransMutator mutator;
 | |
|   bool use_mutator_buf = true;
 | |
|   void* log_buf = NULL;
 | |
|   int64_t log_buffer_size = 0;
 | |
| 
 | |
|   // test the default values
 | |
|   // use MutatorBuf to store data by default
 | |
|   EXPECT_EQ(NULL, mutator.get_mutator_buf());
 | |
|   EXPECT_TRUE(mutator.get_use_mutator_buf());
 | |
|   EXPECT_EQ(NULL, mutator.get_data());
 | |
|   EXPECT_EQ(0, mutator.get_capacity());
 | |
|   EXPECT_EQ(0, mutator.get_position());
 | |
| 
 | |
|   EXPECT_EQ(OB_SUCCESS, mutator.init());
 | |
|   ASSERT_TRUE(NULL != mutator.get_mutator_buf());
 | |
|   EXPECT_TRUE(mutator.get_use_mutator_buf());
 | |
|   EXPECT_EQ(mutator.get_mutator_buf()->get_buf(), mutator.get_data());
 | |
|   EXPECT_EQ(mutator.get_mutator_buf()->get_size(), mutator.get_capacity());
 | |
|   EXPECT_EQ(0, mutator.get_position());
 | |
| 
 | |
|   // test allocator
 | |
|   // 1. test the max buffer length
 | |
|   log_buffer_size = mutator.get_mutator_buf()->get_size();
 | |
|   log_buf = mutator.alloc(log_buffer_size);
 | |
|   EXPECT_TRUE(NULL != log_buf);
 | |
|   EXPECT_EQ(log_buffer_size, mutator.get_position());
 | |
|   mutator.free(log_buf);
 | |
|   log_buf = NULL;
 | |
|   log_buffer_size = 0;
 | |
|   // 2. test the unexpected input
 | |
|   log_buffer_size = mutator.get_mutator_buf()->get_size() + 1;
 | |
|   log_buf = mutator.alloc(log_buffer_size);
 | |
|   EXPECT_EQ(NULL, log_buf);
 | |
|   EXPECT_EQ(0, mutator.get_position());
 | |
| 
 | |
|   // test reset
 | |
|   mutator.reset();
 | |
|   EXPECT_EQ(NULL, mutator.get_mutator_buf());
 | |
|   EXPECT_TRUE(mutator.get_use_mutator_buf());
 | |
|   EXPECT_EQ(NULL, mutator.get_data());
 | |
|   EXPECT_EQ(0, mutator.get_capacity());
 | |
|   EXPECT_EQ(0, mutator.get_position());
 | |
| 
 | |
|   // test use_mutator_buf=true
 | |
|   use_mutator_buf = true;
 | |
|   EXPECT_EQ(OB_SUCCESS, mutator.init(use_mutator_buf));
 | |
|   ASSERT_TRUE(NULL != mutator.get_mutator_buf());
 | |
|   EXPECT_TRUE(mutator.get_use_mutator_buf());
 | |
|   EXPECT_EQ(mutator.get_mutator_buf()->get_buf(), mutator.get_data());
 | |
|   EXPECT_EQ(mutator.get_mutator_buf()->get_size(), mutator.get_capacity());
 | |
|   EXPECT_EQ(0, mutator.get_position());
 | |
| 
 | |
|   // test reset
 | |
|   mutator.reset();
 | |
|   EXPECT_EQ(NULL, mutator.get_mutator_buf());
 | |
|   EXPECT_TRUE(mutator.get_use_mutator_buf());
 | |
|   EXPECT_EQ(NULL, mutator.get_data());
 | |
|   EXPECT_EQ(0, mutator.get_capacity());
 | |
|   EXPECT_EQ(0, mutator.get_position());
 | |
| 
 | |
|   // test use_mutator_buf=false
 | |
|   use_mutator_buf = false;
 | |
|   EXPECT_EQ(OB_SUCCESS, mutator.init(use_mutator_buf));
 | |
|   ASSERT_EQ(NULL, mutator.get_mutator_buf());
 | |
|   EXPECT_FALSE(mutator.get_use_mutator_buf());
 | |
|   EXPECT_EQ(NULL, mutator.get_data());
 | |
|   EXPECT_EQ(0, mutator.get_capacity());
 | |
|   EXPECT_EQ(0, mutator.get_position());
 | |
| }
 | |
| 
 | |
| // test the serialization and deserialization of ObTransMutator
 | |
| TEST_F(TestObTransLog, trans_mutator_serialization)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
|   ObTransMutator orig_mutator;
 | |
|   bool use_mutator_buf = true;
 | |
|   void* log_data = NULL;
 | |
|   int64_t log_data_size = 0;
 | |
|   char ser_buffer[common::OB_MAX_LOG_ALLOWED_SIZE];
 | |
|   int64_t ser_buffer_size = common::OB_MAX_LOG_ALLOWED_SIZE;
 | |
|   int64_t ser_data_size = 0;
 | |
| 
 | |
|   // 1. init Mutator
 | |
|   EXPECT_EQ(OB_SUCCESS, orig_mutator.init());
 | |
|   ASSERT_TRUE(NULL != orig_mutator.get_mutator_buf());
 | |
|   EXPECT_EQ(orig_mutator.get_mutator_buf()->get_buf(), orig_mutator.get_data());
 | |
|   EXPECT_EQ(orig_mutator.get_mutator_buf()->get_size(), orig_mutator.get_capacity());
 | |
|   EXPECT_EQ(0, orig_mutator.get_position());
 | |
| 
 | |
|   // 2. alloc Buffer and init the log
 | |
|   log_data_size = 1 << 20;
 | |
|   log_data = orig_mutator.alloc(log_data_size);
 | |
|   EXPECT_TRUE(NULL != log_data);
 | |
|   EXPECT_EQ(log_data_size, orig_mutator.get_position());
 | |
|   (void)memset(log_data, 'a', log_data_size);
 | |
| 
 | |
|   // 3. serialize Mutator
 | |
|   ser_data_size = 0;
 | |
|   ASSERT_EQ(OB_SUCCESS, orig_mutator.serialize(ser_buffer, ser_buffer_size, ser_data_size));
 | |
| 
 | |
|   // 4. create a new Mutator
 | |
|   ObTransMutator mutator_use_mb;
 | |
|   use_mutator_buf = true;
 | |
|   EXPECT_EQ(OB_SUCCESS, mutator_use_mb.init(use_mutator_buf));
 | |
|   ASSERT_TRUE(NULL != mutator_use_mb.get_mutator_buf());
 | |
|   EXPECT_EQ(mutator_use_mb.get_mutator_buf()->get_buf(), mutator_use_mb.get_data());
 | |
|   EXPECT_EQ(mutator_use_mb.get_mutator_buf()->get_size(), mutator_use_mb.get_capacity());
 | |
|   EXPECT_EQ(0, mutator_use_mb.get_position());
 | |
| 
 | |
|   // 5. deserialize log
 | |
|   int64_t pos_use_mb = 0;
 | |
|   EXPECT_EQ(OB_SUCCESS, mutator_use_mb.deserialize(ser_buffer, ser_data_size, pos_use_mb));
 | |
|   EXPECT_EQ(ser_data_size, pos_use_mb);
 | |
|   EXPECT_EQ(log_data_size, mutator_use_mb.get_position());
 | |
|   EXPECT_EQ(0, memcmp(mutator_use_mb.get_data(), log_data, log_data_size));
 | |
| 
 | |
|   // 6. create a new Mutator without using MutatorBuf
 | |
|   ObTransMutator mutator_no_use_mb;
 | |
|   use_mutator_buf = false;
 | |
|   EXPECT_EQ(OB_SUCCESS, mutator_no_use_mb.init(use_mutator_buf));
 | |
|   ASSERT_EQ(NULL, mutator_no_use_mb.get_mutator_buf());
 | |
|   EXPECT_FALSE(mutator_no_use_mb.get_use_mutator_buf());
 | |
|   EXPECT_EQ(NULL, mutator_no_use_mb.get_data());
 | |
|   EXPECT_EQ(0, mutator_no_use_mb.get_capacity());
 | |
|   EXPECT_EQ(0, mutator_no_use_mb.get_position());
 | |
| 
 | |
|   // 7. deserialize log
 | |
|   int64_t pos_no_use_mb = 0;
 | |
| 
 | |
|   EXPECT_EQ(OB_SUCCESS, mutator_no_use_mb.deserialize(ser_buffer, ser_data_size, pos_no_use_mb));
 | |
|   EXPECT_EQ(ser_data_size, pos_no_use_mb);
 | |
|   EXPECT_TRUE(NULL != mutator_no_use_mb.get_data());
 | |
|   EXPECT_EQ(log_data_size, mutator_no_use_mb.get_position());
 | |
|   EXPECT_EQ(0, memcmp(mutator_no_use_mb.get_data(), log_data, log_data_size));
 | |
| }
 | |
| 
 | |
| //////////////////////test for ObTransRedoLog////////////////////
 | |
| // test the init ObTransRedoLog
 | |
| TEST_F(TestObTransLog, redo_log_init_invalid)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
|   // invalid parameters
 | |
|   int64_t log_type = -1;
 | |
|   ObPartitionKey partition_key;
 | |
|   ObAddr scheduler;
 | |
|   ObPartitionKey coordinator;
 | |
|   ObPartitionArray participants;
 | |
|   ObTransID trans_id;
 | |
|   const uint64_t tenant_id = 100;
 | |
|   const int64_t log_no = 1;
 | |
|   const uint64_t cluster_id = 1000;
 | |
|   ObStartTransParam parms;
 | |
|   ObElrTransInfoArray arr;
 | |
|   const bool can_elr = false;
 | |
|   ObXATransID xid;
 | |
|   const bool is_last = false;
 | |
|   ObTransRedoLog redo_log(log_type,
 | |
|       partition_key,
 | |
|       trans_id,
 | |
|       tenant_id,
 | |
|       log_no,
 | |
|       scheduler,
 | |
|       coordinator,
 | |
|       participants,
 | |
|       parms,
 | |
|       cluster_id,
 | |
|       arr,
 | |
|       can_elr,
 | |
|       xid,
 | |
|       is_last);
 | |
|   EXPECT_FALSE(redo_log.is_valid());
 | |
| 
 | |
|   parms.set_access_mode(ObTransAccessMode::READ_ONLY);
 | |
|   parms.set_type(ObTransType::TRANS_USER);
 | |
|   parms.set_isolation(ObTransIsolation::READ_COMMITED);
 | |
| 
 | |
|   // create an object of ObTransID
 | |
|   ObAddr observer(TestObTransLog::IP_TYPE, TestObTransLog::LOCAL_IP, TestObTransLog::PORT);
 | |
|   trans_id = ObTransID(observer);
 | |
|   partition_key = ObPartitionKey(VALID_TABLE_ID, VALID_PARTITION_ID, VALID_PARTITION_COUNT);
 | |
| 
 | |
|   log_type = OB_LOG_TRANS_REDO;
 | |
|   coordinator = partition_key;
 | |
|   participants.push_back(partition_key);
 | |
|   scheduler = observer;
 | |
| 
 | |
|   ObTransRedoLog redo_log2(log_type,
 | |
|       partition_key,
 | |
|       trans_id,
 | |
|       tenant_id,
 | |
|       log_no,
 | |
|       scheduler,
 | |
|       coordinator,
 | |
|       participants,
 | |
|       parms,
 | |
|       cluster_id,
 | |
|       arr,
 | |
|       can_elr,
 | |
|       xid,
 | |
|       is_last);
 | |
|   EXPECT_TRUE(redo_log2.is_valid());
 | |
| }
 | |
| // test the serialization and deserialization of ObTransRedoLog
 | |
| TEST_F(TestObTransLog, trans_redo_log_encode_decode)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
|   int64_t log_type = OB_LOG_TRANS_REDO;
 | |
|   ObPartitionKey partition_key(VALID_TABLE_ID, VALID_PARTITION_ID, VALID_PARTITION_COUNT);
 | |
|   ObAddr observer(TestObTransLog::IP_TYPE, TestObTransLog::LOCAL_IP, TestObTransLog::PORT);
 | |
|   ObTransID trans_id(observer);
 | |
|   const int64_t log_no = 1;
 | |
|   const uint64_t tenant_id = 100;
 | |
|   ObAddr scheduler;
 | |
|   ObPartitionKey coordinator;
 | |
|   ObPartitionArray participants;
 | |
|   ObStartTransParam parms;
 | |
|   parms.set_access_mode(ObTransAccessMode::READ_ONLY);
 | |
|   parms.set_type(ObTransType::TRANS_USER);
 | |
|   parms.set_isolation(ObTransIsolation::READ_COMMITED);
 | |
|   coordinator = partition_key;
 | |
|   participants.push_back(partition_key);
 | |
|   scheduler = observer;
 | |
|   const uint64_t cluster_id = 1000;
 | |
|   ObElrTransInfoArray arr;
 | |
|   const bool can_elr = false;
 | |
|   ObXATransID xid;
 | |
|   const bool is_last = false;
 | |
| 
 | |
|   ObTransRedoLog redo_log(log_type,
 | |
|       partition_key,
 | |
|       trans_id,
 | |
|       tenant_id,
 | |
|       log_no,
 | |
|       scheduler,
 | |
|       coordinator,
 | |
|       participants,
 | |
|       parms,
 | |
|       cluster_id,
 | |
|       arr,
 | |
|       can_elr,
 | |
|       xid,
 | |
|       is_last);
 | |
|   ASSERT_TRUE(redo_log.is_valid());
 | |
| 
 | |
|   // serialization of ObTransRedoLog
 | |
|   int64_t pos = 0;
 | |
|   const int64_t BUFFER_SIZE = 10240;
 | |
|   char buffer[BUFFER_SIZE];
 | |
|   ASSERT_EQ(OB_SUCCESS, redo_log.serialize(buffer, BUFFER_SIZE, pos));
 | |
| 
 | |
|   // deserialization of ObTransRedoLog
 | |
|   ObTransRedoLogHelper redo_helper1;
 | |
|   ObTransRedoLog redo_log1(redo_helper1);
 | |
|   redo_log1.get_mutator().init();
 | |
|   int64_t start_index = 0;
 | |
|   ASSERT_EQ(OB_SUCCESS, redo_log1.deserialize(buffer, pos, start_index));
 | |
|   EXPECT_TRUE(redo_log1.is_valid());
 | |
| 
 | |
|   // test the consistency
 | |
|   EXPECT_EQ(redo_log.get_log_type(), redo_log1.get_log_type());
 | |
|   EXPECT_EQ(redo_log.get_trans_id(), redo_log1.get_trans_id());
 | |
|   EXPECT_EQ(redo_log.get_partition(), redo_log1.get_partition());
 | |
|   EXPECT_EQ(redo_log.get_log_no(), redo_log1.get_log_no());
 | |
|   EXPECT_EQ(redo_log.get_cluster_id(), redo_log1.get_cluster_id());
 | |
|   EXPECT_EQ(redo_log.is_last(), redo_log1.is_last());
 | |
|   EXPECT_EQ(redo_log.get_xid(), redo_log1.get_xid());
 | |
| 
 | |
|   // check ObStartTransParam
 | |
|   EXPECT_EQ(parms.get_access_mode(), redo_log1.get_trans_param().get_access_mode());
 | |
|   EXPECT_EQ(parms.get_type(), redo_log1.get_trans_param().get_type());
 | |
|   EXPECT_EQ(parms.get_isolation(), redo_log1.get_trans_param().get_isolation());
 | |
| }
 | |
| 
 | |
| //////////////////////test for ObTransPrepareLog////////////////////
 | |
| // test the init of ObTransPrepareLog
 | |
| TEST_F(TestObTransLog, prepare_log_init_invalid)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
|   // invalid parameters
 | |
|   int64_t log_type = -1;
 | |
|   const uint64_t tenant_id = 100;
 | |
|   ObPartitionKey partition_key;
 | |
|   ObTransID trans_id;
 | |
|   ObAddr scheduler;
 | |
|   ObPartitionKey coordinator;
 | |
|   ObPartitionArray participants;
 | |
| 
 | |
|   ObRedoLogIdArray redo_log_ids;
 | |
|   EXPECT_EQ(OB_SUCCESS, redo_log_ids.push_back(1));
 | |
|   EXPECT_EQ(OB_SUCCESS, redo_log_ids.push_back(2));
 | |
|   EXPECT_EQ(OB_SUCCESS, redo_log_ids.push_back(3));
 | |
| 
 | |
|   ObStartTransParam trans_param;
 | |
|   trans_param.set_access_mode(ObTransAccessMode::READ_WRITE);
 | |
|   trans_param.set_type(ObTransType::TRANS_USER);
 | |
|   trans_param.set_isolation(ObTransIsolation::READ_COMMITED);
 | |
|   const int prepare_status = true;
 | |
|   const uint64_t cluster_id = 1000;
 | |
|   PartitionLogInfoArray partition_log_info;
 | |
|   const int64_t checkpoint = 1000;
 | |
| 
 | |
|   ObString trace_id = "trance_id=xxx";
 | |
|   ObElrTransInfoArray arr;
 | |
|   const bool can_elr = false;
 | |
|   ObXATransID xid;
 | |
|   ObTransPrepareLog prepare_log(log_type,
 | |
|       partition_key,
 | |
|       trans_id,
 | |
|       tenant_id,
 | |
|       scheduler,
 | |
|       coordinator,
 | |
|       participants,
 | |
|       trans_param,
 | |
|       prepare_status,
 | |
|       redo_log_ids,
 | |
|       cluster_id,
 | |
|       trace_id,
 | |
|       partition_log_info,
 | |
|       checkpoint,
 | |
|       arr,
 | |
|       can_elr,
 | |
|       trace_id,
 | |
|       xid);
 | |
|   EXPECT_FALSE(prepare_log.is_valid());
 | |
| 
 | |
|   // create an object of ObTransID
 | |
|   ObAddr observer(TestObTransLog::IP_TYPE, TestObTransLog::LOCAL_IP, TestObTransLog::PORT);
 | |
|   trans_id = ObTransID(observer);
 | |
|   partition_key = ObPartitionKey(VALID_TABLE_ID, VALID_PARTITION_ID, VALID_PARTITION_COUNT);
 | |
|   coordinator = partition_key;
 | |
|   participants.push_back(partition_key);
 | |
|   scheduler = observer;
 | |
|   ObTransPrepareLog prepare_log1(log_type,
 | |
|       partition_key,
 | |
|       trans_id,
 | |
|       tenant_id,
 | |
|       scheduler,
 | |
|       coordinator,
 | |
|       participants,
 | |
|       trans_param,
 | |
|       prepare_status,
 | |
|       redo_log_ids,
 | |
|       cluster_id,
 | |
|       trace_id,
 | |
|       partition_log_info,
 | |
|       checkpoint,
 | |
|       arr,
 | |
|       can_elr,
 | |
|       trace_id,
 | |
|       xid);
 | |
|   EXPECT_FALSE(prepare_log1.is_valid());
 | |
| 
 | |
|   log_type = OB_LOG_TRANS_PREPARE;
 | |
|   ObTransPrepareLog prepare_log2(log_type,
 | |
|       partition_key,
 | |
|       trans_id,
 | |
|       tenant_id,
 | |
|       scheduler,
 | |
|       coordinator,
 | |
|       participants,
 | |
|       trans_param,
 | |
|       prepare_status,
 | |
|       redo_log_ids,
 | |
|       cluster_id,
 | |
|       trace_id,
 | |
|       partition_log_info,
 | |
|       checkpoint,
 | |
|       arr,
 | |
|       can_elr,
 | |
|       trace_id,
 | |
|       xid);
 | |
|   EXPECT_TRUE(prepare_log2.is_valid());
 | |
| }
 | |
| // test the serialization and deserialization of ObTransPrepareLog
 | |
| TEST_F(TestObTransLog, trans_prepare_log_encode_decode)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
|   int64_t log_type = OB_LOG_TRANS_PREPARE;
 | |
|   const uint64_t cluster_id = 1000;
 | |
|   ObPartitionKey partition_key(VALID_TABLE_ID, VALID_PARTITION_ID, VALID_PARTITION_COUNT);
 | |
|   ObAddr observer(TestObTransLog::IP_TYPE, TestObTransLog::LOCAL_IP, TestObTransLog::PORT);
 | |
|   ObTransID trans_id(observer);
 | |
|   ObAddr& scheduler = observer;
 | |
|   ObPartitionKey& coordinator = partition_key;
 | |
|   ObPartitionArray participants;
 | |
|   PartitionLogInfoArray partition_log_info;
 | |
|   const int64_t checkpoint = 1000;
 | |
|   participants.push_back(partition_key);
 | |
| 
 | |
|   ObRedoLogIdArray redo_log_ids;
 | |
|   EXPECT_EQ(OB_SUCCESS, redo_log_ids.push_back(1));
 | |
|   EXPECT_EQ(OB_SUCCESS, redo_log_ids.push_back(2));
 | |
|   EXPECT_EQ(OB_SUCCESS, redo_log_ids.push_back(3));
 | |
| 
 | |
|   ObStartTransParam trans_param;
 | |
|   trans_param.set_access_mode(ObTransAccessMode::READ_WRITE);
 | |
|   trans_param.set_type(ObTransType::TRANS_USER);
 | |
|   trans_param.set_isolation(ObTransIsolation::READ_COMMITED);
 | |
| 
 | |
|   const int prepare_status = true;
 | |
|   const uint64_t tenant_id = 100;
 | |
|   ObString trace_id = "trace_id=xxx";
 | |
|   ObElrTransInfoArray arr;
 | |
|   const bool can_elr = false;
 | |
|   ObXATransID xid;
 | |
|   ObTransPrepareLog prepare_log(log_type,
 | |
|       partition_key,
 | |
|       trans_id,
 | |
|       tenant_id,
 | |
|       scheduler,
 | |
|       coordinator,
 | |
|       participants,
 | |
|       trans_param,
 | |
|       prepare_status,
 | |
|       redo_log_ids,
 | |
|       cluster_id,
 | |
|       trace_id,
 | |
|       partition_log_info,
 | |
|       checkpoint,
 | |
|       arr,
 | |
|       can_elr,
 | |
|       trace_id,
 | |
|       xid);
 | |
|   EXPECT_TRUE(prepare_log.is_valid());
 | |
| 
 | |
|   // serialization of ObTransPrepareLog
 | |
|   int64_t pos = 0;
 | |
|   const int64_t BUFFER_SIZE = 10240;
 | |
|   char buffer[BUFFER_SIZE];
 | |
|   ASSERT_EQ(OB_SUCCESS, prepare_log.serialize(buffer, BUFFER_SIZE, pos));
 | |
| 
 | |
|   // deserialization of ObTransPrepareLog
 | |
|   ObTransPrepareLogHelper prepare_helper1;
 | |
|   ObTransPrepareLog prepare_log1(prepare_helper1);
 | |
|   int64_t start_index = 0;
 | |
|   ASSERT_EQ(OB_SUCCESS, prepare_log1.deserialize(buffer, pos, start_index));
 | |
|   EXPECT_TRUE(prepare_log1.is_valid());
 | |
| 
 | |
|   // test the consistency
 | |
|   EXPECT_EQ(prepare_log.get_log_type(), prepare_log1.get_log_type());
 | |
|   EXPECT_EQ(prepare_log.get_trans_id(), prepare_log1.get_trans_id());
 | |
|   EXPECT_EQ(prepare_log.get_partition(), prepare_log1.get_partition());
 | |
|   EXPECT_EQ(prepare_log.get_scheduler(), prepare_log1.get_scheduler());
 | |
|   EXPECT_EQ(prepare_log.get_coordinator(), prepare_log1.get_coordinator());
 | |
|   EXPECT_EQ(prepare_log.get_prepare_status(), prepare_log1.get_prepare_status());
 | |
|   EXPECT_EQ(prepare_log.get_cluster_id(), prepare_log1.get_cluster_id());
 | |
| 
 | |
|   EXPECT_EQ(prepare_log.get_redo_log_ids().count(), prepare_log1.get_redo_log_ids().count());
 | |
|   ObRedoLogIdArray redo_logid_arr = prepare_log1.get_redo_log_ids();
 | |
|   ASSERT_EQ(3, redo_logid_arr.count());
 | |
|   EXPECT_EQ(1, redo_logid_arr[0]);
 | |
|   EXPECT_EQ(2, redo_logid_arr[1]);
 | |
|   EXPECT_EQ(3, redo_logid_arr[2]);
 | |
| 
 | |
|   // check ObStartTransParam
 | |
|   EXPECT_EQ(trans_param.get_access_mode(), prepare_log1.get_trans_param().get_access_mode());
 | |
|   EXPECT_EQ(trans_param.get_type(), prepare_log1.get_trans_param().get_type());
 | |
|   EXPECT_EQ(trans_param.get_isolation(), prepare_log1.get_trans_param().get_isolation());
 | |
| }
 | |
| /////////////////test for TransCommitLog///////////////////
 | |
| // test the init of ObTranscommitLog
 | |
| TEST_F(TestObTransLog, commit_log_init_invalid)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
|   // invalid parameters
 | |
|   int64_t log_type = -1;
 | |
|   ObPartitionKey partition_key;
 | |
|   ObTransID trans_id;
 | |
|   const int64_t global_trans_version = 1000;
 | |
|   const uint64_t cluster_id = 1000;
 | |
| 
 | |
|   PartitionLogInfoArray array;
 | |
|   ObTransCommitLog commit_log(log_type, partition_key, trans_id, array, global_trans_version, 0, cluster_id);
 | |
|   EXPECT_FALSE(commit_log.is_valid());
 | |
| 
 | |
|   // create an object of ObTransID
 | |
|   ObAddr observer(TestObTransLog::IP_TYPE, TestObTransLog::LOCAL_IP, TestObTransLog::PORT);
 | |
|   trans_id = ObTransID(observer);
 | |
|   partition_key = ObPartitionKey(VALID_TABLE_ID, VALID_PARTITION_ID, VALID_PARTITION_COUNT);
 | |
|   ObTransCommitLog commit_log2(log_type, partition_key, trans_id, array, global_trans_version, 0, cluster_id);
 | |
|   EXPECT_FALSE(commit_log2.is_valid());
 | |
| 
 | |
|   log_type = OB_LOG_TRANS_COMMIT;
 | |
|   ObTransCommitLog commit_log3(log_type, partition_key, trans_id, array, global_trans_version, 0, cluster_id);
 | |
|   EXPECT_TRUE(commit_log3.is_valid());
 | |
| }
 | |
| // test the serialization and deserialization of ObTransCommitLog
 | |
| TEST_F(TestObTransLog, trans_commit_log_encode_decode)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
|   int64_t log_type = OB_LOG_TRANS_COMMIT;
 | |
|   const uint64_t cluster_id = 1000;
 | |
|   const int64_t global_trans_version = 1000;
 | |
|   ObPartitionKey partition_key(VALID_TABLE_ID, VALID_PARTITION_ID, VALID_PARTITION_COUNT);
 | |
|   ObAddr observer(TestObTransLog::IP_TYPE, TestObTransLog::LOCAL_IP, TestObTransLog::PORT);
 | |
|   ObTransID trans_id(observer);
 | |
|   PartitionLogInfoArray array;
 | |
|   ObTransCommitLog commit_log(log_type, partition_key, trans_id, array, global_trans_version, 0, cluster_id);
 | |
|   ASSERT_TRUE(commit_log.is_valid());
 | |
| 
 | |
|   // serialization of ObTransCommitLog
 | |
|   int64_t pos = 0;
 | |
|   const int64_t BUFFER_SIZE = 10240;
 | |
|   char buffer[BUFFER_SIZE];
 | |
|   ASSERT_EQ(OB_SUCCESS, commit_log.serialize(buffer, BUFFER_SIZE, pos));
 | |
| 
 | |
|   // deserialization of ObTransCommitLog
 | |
|   PartitionLogInfoArray array1;
 | |
|   ObTransCommitLog commit_log1(array1);
 | |
|   int64_t start_index = 0;
 | |
|   ASSERT_EQ(OB_SUCCESS, commit_log1.deserialize(buffer, pos, start_index));
 | |
|   EXPECT_TRUE(commit_log1.is_valid());
 | |
| 
 | |
|   // test the consistency
 | |
|   EXPECT_EQ(commit_log.get_log_type(), commit_log1.get_log_type());
 | |
|   EXPECT_EQ(commit_log.get_trans_id(), commit_log1.get_trans_id());
 | |
|   EXPECT_EQ(commit_log.get_partition(), commit_log1.get_partition());
 | |
|   EXPECT_EQ(commit_log.get_cluster_id(), commit_log1.get_cluster_id());
 | |
| }
 | |
| 
 | |
| /////////////////////test for ObTransAbortLog///////////////////////
 | |
| // test the init of ObTransAbortLog
 | |
| TEST_F(TestObTransLog, abort_log_init_invalid)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
|   // invalid parameters
 | |
|   int64_t log_type = -1;
 | |
|   ObPartitionKey partition_key;
 | |
|   ObTransID trans_id;
 | |
|   const uint64_t cluster_id = 1000;
 | |
|   PartitionLogInfoArray array;
 | |
| 
 | |
|   ObTransAbortLog abort_log;
 | |
|   EXPECT_EQ(OB_INVALID_ARGUMENT, abort_log.init(log_type, partition_key, trans_id, array, cluster_id));
 | |
| 
 | |
|   // create an object of ObTransID
 | |
|   ObAddr observer(TestObTransLog::IP_TYPE, TestObTransLog::LOCAL_IP, TestObTransLog::PORT);
 | |
|   trans_id = ObTransID(observer);
 | |
|   partition_key = ObPartitionKey(VALID_TABLE_ID, VALID_PARTITION_ID, VALID_PARTITION_COUNT);
 | |
|   EXPECT_EQ(OB_INVALID_ARGUMENT, abort_log.init(log_type, partition_key, trans_id, array, cluster_id));
 | |
|   log_type = OB_LOG_TRANS_ABORT;
 | |
|   EXPECT_EQ(OB_SUCCESS, abort_log.init(log_type, partition_key, trans_id, array, cluster_id));
 | |
| 
 | |
|   EXPECT_TRUE(abort_log.is_valid());
 | |
| }
 | |
| // test the serialization and deserialization of ObTransAbortlog
 | |
| TEST_F(TestObTransLog, trans_abort_log_encode_decode)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
|   int64_t log_type = OB_LOG_TRANS_ABORT;
 | |
|   const uint64_t cluster_id = 1000;
 | |
|   PartitionLogInfoArray array;
 | |
|   ObPartitionKey partition_key(VALID_TABLE_ID, VALID_PARTITION_ID, VALID_PARTITION_COUNT);
 | |
|   ObAddr observer(TestObTransLog::IP_TYPE, TestObTransLog::LOCAL_IP, TestObTransLog::PORT);
 | |
|   ObTransID trans_id(observer);
 | |
|   ObTransAbortLog abort_log;
 | |
|   ASSERT_EQ(OB_SUCCESS, abort_log.init(log_type, partition_key, trans_id, array, cluster_id));
 | |
|   EXPECT_TRUE(abort_log.is_valid());
 | |
| 
 | |
|   // serialization of ObTransAbortLog
 | |
|   int64_t pos = 0;
 | |
|   const int64_t BUFFER_SIZE = 10240;
 | |
|   char buffer[BUFFER_SIZE];
 | |
|   ASSERT_EQ(OB_SUCCESS, abort_log.serialize(buffer, BUFFER_SIZE, pos));
 | |
| 
 | |
|   // deserialization of ObTransAbortLog
 | |
|   ObTransAbortLog abort_log1;
 | |
|   int64_t start_index = 0;
 | |
|   ASSERT_EQ(OB_SUCCESS, abort_log1.deserialize(buffer, pos, start_index));
 | |
|   EXPECT_TRUE(abort_log1.is_valid());
 | |
| 
 | |
|   // test the consistency
 | |
|   EXPECT_EQ(abort_log.get_log_type(), abort_log1.get_log_type());
 | |
|   EXPECT_EQ(abort_log.get_trans_id(), abort_log1.get_trans_id());
 | |
|   EXPECT_EQ(abort_log.get_partition(), abort_log1.get_partition());
 | |
|   EXPECT_EQ(abort_log.get_cluster_id(), abort_log1.get_cluster_id());
 | |
| }
 | |
| //////////////////////test for ObTransClearLog/////////////////////////////
 | |
| // test the init ObTransClearLog
 | |
| TEST_F(TestObTransLog, clear_log_init_invalid)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
|   // invalid parameters
 | |
|   int64_t log_type = -1;
 | |
|   ObPartitionKey partition_key;
 | |
|   ObTransID trans_id;
 | |
|   const uint64_t cluster_id = 1000;
 | |
| 
 | |
|   ObTransClearLog clear_log;
 | |
|   EXPECT_EQ(OB_INVALID_ARGUMENT, clear_log.init(log_type, partition_key, trans_id, cluster_id));
 | |
| 
 | |
|   // create an object of ObTransID
 | |
|   ObAddr observer(TestObTransLog::IP_TYPE, TestObTransLog::LOCAL_IP, TestObTransLog::PORT);
 | |
|   trans_id = ObTransID(observer);
 | |
|   partition_key = ObPartitionKey(VALID_TABLE_ID, VALID_PARTITION_ID, VALID_PARTITION_COUNT);
 | |
|   TRANS_LOG(INFO, "arguments info", K(log_type), K(partition_key), K(trans_id));
 | |
|   EXPECT_EQ(OB_INVALID_ARGUMENT, clear_log.init(log_type, partition_key, trans_id, cluster_id));
 | |
| 
 | |
|   log_type = OB_LOG_TRANS_CLEAR;
 | |
|   EXPECT_EQ(OB_SUCCESS, clear_log.init(log_type, partition_key, trans_id, cluster_id));
 | |
| 
 | |
|   EXPECT_TRUE(clear_log.is_valid());
 | |
| }
 | |
| 
 | |
| // test the serialization and deserialization of ObTransClearlog
 | |
| TEST_F(TestObTransLog, trans_clear_log_encode_decode)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
|   int64_t log_type = OB_LOG_TRANS_CLEAR;
 | |
|   ObPartitionKey partition_key(VALID_TABLE_ID, VALID_PARTITION_ID, VALID_PARTITION_COUNT);
 | |
|   ObAddr observer(TestObTransLog::IP_TYPE, TestObTransLog::LOCAL_IP, TestObTransLog::PORT);
 | |
|   ObTransID trans_id(observer);
 | |
|   ObTransClearLog clear_log;
 | |
|   const uint64_t cluster_id = 1000;
 | |
|   ASSERT_EQ(OB_SUCCESS, clear_log.init(log_type, partition_key, trans_id, cluster_id));
 | |
|   ASSERT_TRUE(clear_log.is_valid());
 | |
| 
 | |
|   // serialization of ObTransClearLog
 | |
|   int64_t pos = 0;
 | |
|   const int64_t BUFFER_SIZE = 10240;
 | |
|   char buffer[BUFFER_SIZE];
 | |
|   EXPECT_EQ(OB_SUCCESS, clear_log.serialize(buffer, BUFFER_SIZE, pos));
 | |
| 
 | |
|   // deserialization of ObTransClearLog
 | |
|   ObTransClearLog clear_log1;
 | |
|   int64_t start_index = 0;
 | |
|   EXPECT_EQ(OB_SUCCESS, clear_log1.deserialize(buffer, pos, start_index));
 | |
|   EXPECT_TRUE(clear_log1.is_valid());
 | |
| 
 | |
|   // test the consistency
 | |
|   EXPECT_EQ(clear_log.get_log_type(), clear_log1.get_log_type());
 | |
|   EXPECT_EQ(clear_log.get_trans_id(), clear_log1.get_trans_id());
 | |
|   EXPECT_EQ(clear_log.get_partition(), clear_log1.get_partition());
 | |
|   EXPECT_EQ(clear_log.get_cluster_id(), clear_log1.get_cluster_id());
 | |
| }
 | |
| 
 | |
| TEST_F(TestObTransLog, sp_redo_log_init_invalid)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
|   // invalid parameters
 | |
|   int64_t log_type = -1;
 | |
|   ObPartitionKey partition_key;
 | |
|   ObTransID trans_id;
 | |
|   const uint64_t tenant_id = 100;
 | |
|   const int64_t log_no = 1;
 | |
|   const uint64_t cluster_id = 1000;
 | |
|   ObStartTransParam parms;
 | |
|   ObElrTransInfoArray arr;
 | |
|   const bool can_elr = false;
 | |
|   ObSpTransRedoLog redo_log;
 | |
|   EXPECT_EQ(OB_INVALID_ARGUMENT,
 | |
|       redo_log.init(log_type, partition_key, trans_id, tenant_id, log_no, parms, cluster_id, arr, can_elr));
 | |
| 
 | |
|   parms.set_access_mode(ObTransAccessMode::READ_ONLY);
 | |
|   parms.set_type(ObTransType::TRANS_USER);
 | |
|   parms.set_isolation(ObTransIsolation::READ_COMMITED);
 | |
| 
 | |
|   // create an object of ObTtransID
 | |
|   ObAddr observer(TestObTransLog::IP_TYPE, TestObTransLog::LOCAL_IP, TestObTransLog::PORT);
 | |
|   trans_id = ObTransID(observer);
 | |
|   partition_key = ObPartitionKey(VALID_TABLE_ID, VALID_PARTITION_ID, VALID_PARTITION_COUNT);
 | |
| 
 | |
|   log_type = OB_LOG_SP_TRANS_REDO;
 | |
|   EXPECT_EQ(
 | |
|       OB_SUCCESS, redo_log.init(log_type, partition_key, trans_id, tenant_id, log_no, parms, cluster_id, arr, can_elr));
 | |
|   EXPECT_TRUE(redo_log.is_valid());
 | |
| }
 | |
| 
 | |
| // test the serialization and deserialization of ObSpTransRedoLog
 | |
| TEST_F(TestObTransLog, sp_trans_redo_log_encode_decode)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
|   int64_t log_type = OB_LOG_SP_TRANS_REDO;
 | |
|   ObPartitionKey partition_key(VALID_TABLE_ID, VALID_PARTITION_ID, VALID_PARTITION_COUNT);
 | |
|   ObAddr observer(TestObTransLog::IP_TYPE, TestObTransLog::LOCAL_IP, TestObTransLog::PORT);
 | |
|   ObTransID trans_id(observer);
 | |
|   const int64_t log_no = 1;
 | |
|   const uint64_t tenant_id = 100;
 | |
|   ObStartTransParam parms;
 | |
|   parms.set_access_mode(ObTransAccessMode::READ_ONLY);
 | |
|   parms.set_type(ObTransType::TRANS_USER);
 | |
|   parms.set_isolation(ObTransIsolation::READ_COMMITED);
 | |
|   const uint64_t cluster_id = 1000;
 | |
| 
 | |
|   ObElrTransInfoArray arr;
 | |
|   const bool can_elr = false;
 | |
|   ObSpTransRedoLog redo_log;
 | |
|   ASSERT_EQ(
 | |
|       OB_SUCCESS, redo_log.init(log_type, partition_key, trans_id, tenant_id, log_no, parms, cluster_id, arr, can_elr));
 | |
|   ASSERT_TRUE(redo_log.is_valid());
 | |
| 
 | |
|   // serialization of ObSpTransRedoLog
 | |
|   int64_t pos = 0;
 | |
|   const int64_t BUFFER_SIZE = 10240;
 | |
|   char buffer[BUFFER_SIZE];
 | |
|   ASSERT_EQ(OB_SUCCESS, redo_log.serialize(buffer, BUFFER_SIZE, pos));
 | |
| 
 | |
|   // deserialization of ObSpTransRedoLog
 | |
|   ObSpTransRedoLog redo_log1;
 | |
|   redo_log1.get_mutator().init();
 | |
|   int64_t start_index = 0;
 | |
|   ASSERT_EQ(OB_SUCCESS, redo_log1.deserialize(buffer, pos, start_index));
 | |
|   EXPECT_TRUE(redo_log1.is_valid());
 | |
| 
 | |
|   // test the consistency
 | |
|   EXPECT_EQ(redo_log.get_log_type(), redo_log1.get_log_type());
 | |
|   EXPECT_EQ(redo_log.get_trans_id(), redo_log1.get_trans_id());
 | |
|   EXPECT_EQ(redo_log.get_partition(), redo_log1.get_partition());
 | |
|   EXPECT_EQ(redo_log.get_log_no(), redo_log1.get_log_no());
 | |
|   EXPECT_EQ(redo_log.get_cluster_id(), redo_log1.get_cluster_id());
 | |
| 
 | |
|   // check ObStartTransParam
 | |
|   EXPECT_EQ(parms.get_access_mode(), redo_log1.get_trans_param().get_access_mode());
 | |
|   EXPECT_EQ(parms.get_type(), redo_log1.get_trans_param().get_type());
 | |
|   EXPECT_EQ(parms.get_isolation(), redo_log1.get_trans_param().get_isolation());
 | |
| }
 | |
| 
 | |
| // test the init of ObSpTransCommitLog
 | |
| TEST_F(TestObTransLog, sp_commit_log_init_invalid)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
|   // invalid parameters
 | |
|   int64_t log_type = -1;
 | |
|   ObPartitionKey partition_key;
 | |
|   ObTransID trans_id;
 | |
|   const uint64_t cluster_id = 1000;
 | |
|   ObRedoLogIdArray redo_log_ids;
 | |
|   EXPECT_EQ(OB_SUCCESS, redo_log_ids.push_back(1));
 | |
|   EXPECT_EQ(OB_SUCCESS, redo_log_ids.push_back(2));
 | |
|   EXPECT_EQ(OB_SUCCESS, redo_log_ids.push_back(3));
 | |
|   const uint64_t tenant_id = 100;
 | |
|   const ObString trace_id = "trace_id=xxx";
 | |
|   ObStartTransParam parms;
 | |
|   parms.set_access_mode(ObTransAccessMode::READ_ONLY);
 | |
|   parms.set_type(ObTransType::TRANS_USER);
 | |
|   parms.set_isolation(ObTransIsolation::READ_COMMITED);
 | |
| 
 | |
|   ObElrTransInfoArray arr;
 | |
|   const bool can_elr = false;
 | |
|   ObSpTransCommitLog commit_log;
 | |
|   EXPECT_EQ(OB_INVALID_ARGUMENT,
 | |
|       commit_log.init(log_type,
 | |
|           partition_key,
 | |
|           tenant_id,
 | |
|           trans_id,
 | |
|           0,
 | |
|           cluster_id,
 | |
|           redo_log_ids,
 | |
|           parms,
 | |
|           0,
 | |
|           trace_id,
 | |
|           100,
 | |
|           arr,
 | |
|           can_elr,
 | |
|           trace_id));
 | |
| 
 | |
|   // create an object of ObTransID
 | |
|   ObAddr observer(TestObTransLog::IP_TYPE, TestObTransLog::LOCAL_IP, TestObTransLog::PORT);
 | |
|   trans_id = ObTransID(observer);
 | |
|   partition_key = ObPartitionKey(VALID_TABLE_ID, VALID_PARTITION_ID, VALID_PARTITION_COUNT);
 | |
|   EXPECT_EQ(OB_INVALID_ARGUMENT,
 | |
|       commit_log.init(log_type,
 | |
|           partition_key,
 | |
|           tenant_id,
 | |
|           trans_id,
 | |
|           0,
 | |
|           cluster_id,
 | |
|           redo_log_ids,
 | |
|           parms,
 | |
|           0,
 | |
|           trace_id,
 | |
|           100,
 | |
|           arr,
 | |
|           can_elr,
 | |
|           trace_id));
 | |
| 
 | |
|   log_type = OB_LOG_SP_TRANS_COMMIT;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       commit_log.init(log_type,
 | |
|           partition_key,
 | |
|           tenant_id,
 | |
|           trans_id,
 | |
|           0,
 | |
|           cluster_id,
 | |
|           redo_log_ids,
 | |
|           parms,
 | |
|           0,
 | |
|           trace_id,
 | |
|           100,
 | |
|           arr,
 | |
|           can_elr,
 | |
|           trace_id));
 | |
| 
 | |
|   EXPECT_TRUE(commit_log.is_valid());
 | |
| }
 | |
| 
 | |
| // test the serialization and deserialization of ObSpTransCommitLog
 | |
| TEST_F(TestObTransLog, sp_trans_commit_log_encode_decode)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
|   int64_t log_type = OB_LOG_SP_TRANS_COMMIT;
 | |
|   const uint64_t cluster_id = 1000;
 | |
|   ObRedoLogIdArray redo_log_ids;
 | |
|   EXPECT_EQ(OB_SUCCESS, redo_log_ids.push_back(1));
 | |
|   EXPECT_EQ(OB_SUCCESS, redo_log_ids.push_back(2));
 | |
|   EXPECT_EQ(OB_SUCCESS, redo_log_ids.push_back(3));
 | |
|   ObPartitionKey partition_key(VALID_TABLE_ID, VALID_PARTITION_ID, VALID_PARTITION_COUNT);
 | |
|   ObAddr observer(TestObTransLog::IP_TYPE, TestObTransLog::LOCAL_IP, TestObTransLog::PORT);
 | |
|   ObTransID trans_id(observer);
 | |
|   const uint64_t tenant_id = 100;
 | |
|   ObStartTransParam parms;
 | |
|   parms.set_access_mode(ObTransAccessMode::READ_ONLY);
 | |
|   parms.set_type(ObTransType::TRANS_USER);
 | |
|   parms.set_isolation(ObTransIsolation::READ_COMMITED);
 | |
|   const ObString trace_id = "trace_id=xxx";
 | |
|   ObElrTransInfoArray arr;
 | |
|   const bool can_elr = false;
 | |
| 
 | |
|   ObSpTransCommitLog commit_log;
 | |
|   ASSERT_EQ(OB_SUCCESS,
 | |
|       commit_log.init(log_type,
 | |
|           partition_key,
 | |
|           tenant_id,
 | |
|           trans_id,
 | |
|           0,
 | |
|           cluster_id,
 | |
|           redo_log_ids,
 | |
|           parms,
 | |
|           0,
 | |
|           trace_id,
 | |
|           100,
 | |
|           arr,
 | |
|           can_elr,
 | |
|           trace_id));
 | |
|   ASSERT_TRUE(commit_log.is_valid());
 | |
| 
 | |
|   // serialization of ObSpTransCommitLog
 | |
|   int64_t pos = 0;
 | |
|   const int64_t BUFFER_SIZE = 10240;
 | |
|   char buffer[BUFFER_SIZE];
 | |
|   ASSERT_EQ(OB_SUCCESS, commit_log.serialize(buffer, BUFFER_SIZE, pos));
 | |
| 
 | |
|   // deserialization of ObSpTransCommitLog
 | |
|   ObSpTransCommitLog commit_log1;
 | |
|   commit_log1.get_mutator().init();
 | |
|   commit_log1.get_mutator().reset();
 | |
|   int64_t start_index = 0;
 | |
|   ASSERT_EQ(OB_NOT_INIT, commit_log1.deserialize(buffer, pos, start_index));
 | |
|   EXPECT_TRUE(commit_log1.is_valid());
 | |
| }
 | |
| 
 | |
| // test the init of ObSpTransAbortLog
 | |
| TEST_F(TestObTransLog, sp_abort_log_init_invalid)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
|   // invalid parameters
 | |
|   int64_t log_type = -1;
 | |
|   ObPartitionKey partition_key;
 | |
|   ObTransID trans_id;
 | |
|   const uint64_t cluster_id = 1000;
 | |
| 
 | |
|   ObSpTransAbortLog abort_log;
 | |
|   EXPECT_EQ(OB_INVALID_ARGUMENT, abort_log.init(log_type, partition_key, trans_id, cluster_id));
 | |
| 
 | |
|   // create an object of ObTtransID
 | |
|   ObAddr observer(TestObTransLog::IP_TYPE, TestObTransLog::LOCAL_IP, TestObTransLog::PORT);
 | |
|   trans_id = ObTransID(observer);
 | |
|   partition_key = ObPartitionKey(VALID_TABLE_ID, VALID_PARTITION_ID, VALID_PARTITION_COUNT);
 | |
|   EXPECT_EQ(OB_INVALID_ARGUMENT, abort_log.init(log_type, partition_key, trans_id, cluster_id));
 | |
|   log_type = OB_LOG_SP_TRANS_ABORT;
 | |
|   EXPECT_EQ(OB_SUCCESS, abort_log.init(log_type, partition_key, trans_id, cluster_id));
 | |
| 
 | |
|   EXPECT_TRUE(abort_log.is_valid());
 | |
| }
 | |
| // test the serialization and deserialization of ObSpTransAbortlog
 | |
| TEST_F(TestObTransLog, sp_trans_abort_log_encode_decode)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
|   int64_t log_type = OB_LOG_SP_TRANS_ABORT;
 | |
|   const uint64_t cluster_id = 1000;
 | |
|   ObPartitionKey partition_key(VALID_TABLE_ID, VALID_PARTITION_ID, VALID_PARTITION_COUNT);
 | |
|   ObAddr observer(TestObTransLog::IP_TYPE, TestObTransLog::LOCAL_IP, TestObTransLog::PORT);
 | |
|   ObTransID trans_id(observer);
 | |
|   ObSpTransAbortLog abort_log;
 | |
|   ASSERT_EQ(OB_SUCCESS, abort_log.init(log_type, partition_key, trans_id, cluster_id));
 | |
|   EXPECT_TRUE(abort_log.is_valid());
 | |
| 
 | |
|   // serialization of ObSpTransAbortLog
 | |
|   int64_t pos = 0;
 | |
|   const int64_t BUFFER_SIZE = 10240;
 | |
|   char buffer[BUFFER_SIZE];
 | |
|   ASSERT_EQ(OB_SUCCESS, abort_log.serialize(buffer, BUFFER_SIZE, pos));
 | |
| 
 | |
|   // deserialization of ObSpTransAbortLog
 | |
|   ObSpTransAbortLog abort_log1;
 | |
|   int64_t start_index = 0;
 | |
|   ASSERT_EQ(OB_SUCCESS, abort_log1.deserialize(buffer, pos, start_index));
 | |
|   EXPECT_TRUE(abort_log1.is_valid());
 | |
| 
 | |
|   // test the consistency
 | |
|   EXPECT_EQ(abort_log.get_log_type(), abort_log1.get_log_type());
 | |
|   EXPECT_EQ(abort_log.get_trans_id(), abort_log1.get_trans_id());
 | |
|   EXPECT_EQ(abort_log.get_partition(), abort_log1.get_partition());
 | |
|   EXPECT_EQ(abort_log.get_cluster_id(), abort_log1.get_cluster_id());
 | |
| }
 | |
| }  // namespace unittest
 | |
| }  // namespace oceanbase
 | |
| 
 | |
| using namespace oceanbase;
 | |
| using namespace oceanbase::common;
 | |
| 
 | |
| int main(int argc, char** argv)
 | |
| {
 | |
|   int ret = 1;
 | |
|   ObLogger& logger = ObLogger::get_logger();
 | |
|   logger.set_file_name("test_ob_trans_log.log", true);
 | |
|   logger.set_log_level(OB_LOG_LEVEL_INFO);
 | |
|   testing::InitGoogleTest(&argc, argv);
 | |
|   ret = RUN_ALL_TESTS();
 | |
|   return ret;
 | |
| }
 | 
