913 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			913 lines
		
	
	
		
			27 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_msg.h"
 | |
| #include "storage/transaction/ob_trans_msg_type.h"
 | |
| #include <gtest/gtest.h>
 | |
| #include "share/ob_errno.h"
 | |
| #include "lib/oblog/ob_log.h"
 | |
| #include "common/ob_partition_key.h"
 | |
| #include "common/ob_clock_generator.h"
 | |
| 
 | |
| namespace oceanbase {
 | |
| using namespace common;
 | |
| using namespace transaction;
 | |
| namespace unittest {
 | |
| class TestObTransMsg : public ::testing::Test {
 | |
| public:
 | |
|   virtual void SetUp()
 | |
|   {
 | |
|     init_();
 | |
|   }
 | |
|   virtual void TearDown()
 | |
|   {}
 | |
| 
 | |
| private:
 | |
|   int init_();
 | |
| 
 | |
| public:
 | |
|   // valid partition parameters
 | |
|   static const int64_t VALID_TABLE_ID = 1;
 | |
|   static const int32_t VALID_PARTITION_ID = 1;
 | |
|   static const int32_t VALID_PARTITION_COUNT = 100;
 | |
| 
 | |
|   // invalid partition parameters
 | |
|   static const int64_t INVALID_TABLE_ID = -1;
 | |
|   static const int32_t INVALID_PARTITION_ID = -1;
 | |
|   static const int32_t INVALID_PARTITION_COUNT = -100;
 | |
| 
 | |
|   static const int32_t PORT = 8080;
 | |
|   static const ObAddr::VER IP_TYPE = ObAddr::IPV4;
 | |
|   static const char* LOCAL_IP;
 | |
|   static const uint64_t TENANT_ID = 1001;
 | |
| 
 | |
| public:
 | |
|   common::ObAddr observer_;
 | |
| };
 | |
| const char* TestObTransMsg::LOCAL_IP = "127.0.0.1";
 | |
| 
 | |
| int TestObTransMsg::init_()
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   observer_ = ObAddr(TestObTransMsg::IP_TYPE, TestObTransMsg::LOCAL_IP, TestObTransMsg::PORT);
 | |
| 
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| //////////////////////basic function test//////////////////////////////////////////
 | |
| // test the init of ObTransMsg
 | |
| TEST_F(TestObTransMsg, trans_msg_init_valid)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
| 
 | |
|   const int64_t PARTICIPANT_NUM = 10;
 | |
|   // create an object of ObTtransID
 | |
|   ObTransID trans_id(observer_);
 | |
|   // create all participants
 | |
|   ObPartitionArray participants;
 | |
|   for (int64_t i = 0; i < PARTICIPANT_NUM; ++i) {
 | |
|     ObPartitionKey partition_key(VALID_TABLE_ID + i, VALID_PARTITION_ID, VALID_PARTITION_COUNT);
 | |
|     ASSERT_EQ(OB_SUCCESS, participants.push_back(partition_key));
 | |
|   }
 | |
| 
 | |
|   // create scheduler and coordinator
 | |
|   ObAddr& scheduler = observer_;
 | |
|   const ObPartitionKey& coordinator = participants.at(0);
 | |
| 
 | |
|   // create sender and receiver
 | |
|   const ObPartitionKey& sender = participants.at(0);
 | |
|   const ObPartitionKey& receiver = participants.at(1);
 | |
| 
 | |
|   // create an object of ObStartTransParm
 | |
|   ObStartTransParam parms;
 | |
|   parms.set_access_mode(ObTransAccessMode::READ_ONLY);
 | |
|   parms.set_type(ObTransType::TRANS_USER);
 | |
|   parms.set_isolation(ObTransIsolation::READ_COMMITED);
 | |
| 
 | |
|   int64_t msg_type = OB_TRANS_COMMIT_REQUEST;
 | |
|   int64_t trans_time = 9870;
 | |
|   int64_t sql_no = 1;
 | |
|   int32_t status = 1;
 | |
|   int64_t state = Ob2PCState::COMMIT;
 | |
|   const int64_t trans_version = 1;
 | |
|   const int64_t request_id = ObClockGenerator::getClock();
 | |
|   const ObStmtRollbackInfo stmt_rollback_info;
 | |
|   const ObString trace_id = "trance_id=xxx";
 | |
| 
 | |
|   ObTransMsg msg;
 | |
|   ASSERT_EQ(OB_SUCCESS,
 | |
|       msg.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           scheduler,
 | |
|           coordinator,
 | |
|           participants,
 | |
|           parms,
 | |
|           observer_,
 | |
|           sql_no,
 | |
|           status,
 | |
|           state,
 | |
|           trans_version,
 | |
|           request_id,
 | |
|           MonotonicTs(0)));
 | |
|   ASSERT_TRUE(msg.is_valid());
 | |
| 
 | |
|   // test the serialization of ObTransMsg
 | |
|   int64_t pos = 0;
 | |
|   const int64_t BUFFER_SIZE = 10240;
 | |
|   char buffer[BUFFER_SIZE];
 | |
|   ASSERT_EQ(OB_SUCCESS, msg.serialize(buffer, BUFFER_SIZE, pos));
 | |
| 
 | |
|   // test the deserialization of ObTransMsg
 | |
|   ObTransMsg msg1;
 | |
|   int64_t start_index = 0;
 | |
|   ASSERT_EQ(OB_SUCCESS, msg1.deserialize(buffer, pos, start_index));
 | |
|   EXPECT_EQ(trans_id, msg1.get_trans_id());
 | |
|   EXPECT_EQ(msg_type, msg1.get_msg_type());
 | |
|   EXPECT_EQ(trans_time, msg1.get_trans_time());
 | |
|   EXPECT_EQ(sender, msg1.get_sender());
 | |
|   EXPECT_EQ(receiver, msg1.get_receiver());
 | |
|   EXPECT_EQ(scheduler, msg1.get_scheduler());
 | |
|   EXPECT_EQ(coordinator, msg1.get_coordinator());
 | |
|   EXPECT_EQ(sql_no, msg1.get_sql_no());
 | |
|   EXPECT_EQ(status, msg1.get_status());
 | |
|   EXPECT_EQ(observer_, msg1.get_sender_addr());
 | |
|   EXPECT_EQ(state, msg1.get_state());
 | |
|   EXPECT_EQ(trans_version, msg1.get_trans_version());
 | |
|   EXPECT_EQ(request_id, msg1.get_request_id());
 | |
| 
 | |
|   // results of deserializing ObStartTransParam
 | |
|   ObStartTransParam start_trans_param = msg1.get_trans_param();
 | |
|   EXPECT_EQ(parms.get_access_mode(), start_trans_param.get_access_mode());
 | |
|   EXPECT_EQ(parms.get_type(), start_trans_param.get_type());
 | |
|   EXPECT_EQ(parms.get_isolation(), start_trans_param.get_isolation());
 | |
|   // results of deserializing participants
 | |
|   EXPECT_EQ(participants.count(), msg1.get_participants().count());
 | |
| 
 | |
|   // operations of serializing and deserializing ObPartitionToLogId
 | |
|   ObPartitionKey partition(VALID_TABLE_ID, VALID_PARTITION_ID, VALID_PARTITION_COUNT);
 | |
|   int64_t log_id = 1;
 | |
|   ObPartitionLogInfo partition_log_info(partition, log_id, ObClockGenerator::getClock());
 | |
|   pos = 0;
 | |
|   start_index = 0;
 | |
|   ASSERT_EQ(OB_SUCCESS, partition_log_info.serialize(buffer, BUFFER_SIZE, pos));
 | |
|   // test the reulst of deserialization
 | |
|   ObPartitionLogInfo partition_log_info1;
 | |
|   ASSERT_EQ(OB_SUCCESS, partition_log_info1.deserialize(buffer, pos, start_index));
 | |
|   EXPECT_EQ(partition, partition_log_info1.get_partition());
 | |
|   EXPECT_EQ(log_id, partition_log_info1.get_log_id());
 | |
| 
 | |
|   // invalid input parameters of init
 | |
|   ObStartTransParam parms1;
 | |
|   ObTransMsg msg2;
 | |
|   EXPECT_EQ(OB_INVALID_ARGUMENT,
 | |
|       msg2.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           scheduler,
 | |
|           coordinator,
 | |
|           participants,
 | |
|           parms1,
 | |
|           observer_,
 | |
|           sql_no,
 | |
|           status,
 | |
|           state,
 | |
|           trans_version,
 | |
|           ObClockGenerator::getClock(),
 | |
|           MonotonicTs(0)));
 | |
|   PartitionLogInfoArray log_arr;
 | |
|   EXPECT_EQ(OB_SUCCESS, log_arr.push_back(partition_log_info));
 | |
|   EXPECT_EQ(OB_NOT_INIT, msg2.set_partition_log_info_arr(log_arr));
 | |
|   EXPECT_EQ(OB_NOT_INIT, msg2.set_prepare_log_id(log_id));
 | |
|   EXPECT_FALSE(msg2.is_valid());
 | |
|   // repeated init
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       msg2.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           scheduler,
 | |
|           coordinator,
 | |
|           participants,
 | |
|           parms,
 | |
|           observer_,
 | |
|           sql_no,
 | |
|           status,
 | |
|           state,
 | |
|           trans_version,
 | |
|           ObClockGenerator::getClock(),
 | |
|           MonotonicTs(0)));
 | |
|   EXPECT_TRUE(msg2.is_valid());
 | |
|   EXPECT_EQ(OB_INIT_TWICE,
 | |
|       msg2.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           scheduler,
 | |
|           coordinator,
 | |
|           participants,
 | |
|           parms,
 | |
|           observer_,
 | |
|           sql_no,
 | |
|           status,
 | |
|           state,
 | |
|           trans_version,
 | |
|           ObClockGenerator::getClock(),
 | |
|           MonotonicTs(0)));
 | |
| }
 | |
| 
 | |
| // OB_TRANS_COMMIT_REQUEST/RESPONSE
 | |
| // OB_TRANS_ABORT_REQUEST/RESPONSE
 | |
| TEST_F(TestObTransMsg, trans_commit_abort_request_response_msg)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
| 
 | |
|   const int64_t PARTICIPANT_NUM = 10;
 | |
|   ObTransID trans_id(observer_);
 | |
|   ObPartitionArray participants;
 | |
|   ObTransLocationCache cache;
 | |
|   for (int64_t i = 0; i < PARTICIPANT_NUM; ++i) {
 | |
|     ObPartitionKey partition_key(VALID_TABLE_ID + i, VALID_PARTITION_ID, VALID_PARTITION_COUNT);
 | |
|     ASSERT_EQ(OB_SUCCESS, participants.push_back(partition_key));
 | |
|     ObPartitionLeaderInfo info(partition_key, observer_);
 | |
|     ASSERT_EQ(OB_SUCCESS, cache.push_back(info));
 | |
|   }
 | |
|   const ObPartitionKey& sender = participants.at(0);
 | |
|   const ObPartitionKey& receiver = participants.at(1);
 | |
|   const ObAddr& scheduler = observer_;
 | |
|   const ObPartitionKey coordinator = participants.at(0);
 | |
| 
 | |
|   // create an object of ObStartTransParm
 | |
|   ObStartTransParam parms;
 | |
|   parms.set_access_mode(ObTransAccessMode::READ_ONLY);
 | |
|   parms.set_type(ObTransType::TRANS_USER);
 | |
|   parms.set_isolation(ObTransIsolation::READ_COMMITED);
 | |
|   int64_t trans_time = 9870;
 | |
|   const int32_t status = OB_SUCCESS;
 | |
| 
 | |
|   // OB_TRANS_COMMIT_REQUEST
 | |
|   int64_t msg_type = OB_TRANS_STMT_ROLLBACK_REQUEST;
 | |
|   const int64_t commit_times = 1;
 | |
|   ObTransMsg trans_commit_request_msg;
 | |
|   const int64_t need_wait_interval_us = 0;
 | |
|   const ObStmtRollbackInfo stmt_rollback_info;
 | |
|   const ObString trace_id = "trance_id=xxx";
 | |
|   const ObXATransID xid;
 | |
| 
 | |
|   EXPECT_EQ(OB_INVALID_ARGUMENT,
 | |
|       trans_commit_request_msg.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           scheduler,
 | |
|           coordinator,
 | |
|           participants,
 | |
|           parms,
 | |
|           observer_,
 | |
|           cache,
 | |
|           commit_times,
 | |
|           MonotonicTs(0),
 | |
|           false,
 | |
|           stmt_rollback_info,
 | |
|           trace_id,
 | |
|           xid));
 | |
|   msg_type = OB_TRANS_COMMIT_REQUEST;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       trans_commit_request_msg.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           scheduler,
 | |
|           coordinator,
 | |
|           participants,
 | |
|           parms,
 | |
|           observer_,
 | |
|           cache,
 | |
|           commit_times,
 | |
|           MonotonicTs(0),
 | |
|           false,
 | |
|           stmt_rollback_info,
 | |
|           trace_id,
 | |
|           xid));
 | |
|   EXPECT_EQ(OB_INIT_TWICE,
 | |
|       trans_commit_request_msg.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           scheduler,
 | |
|           coordinator,
 | |
|           participants,
 | |
|           parms,
 | |
|           observer_,
 | |
|           cache,
 | |
|           commit_times,
 | |
|           MonotonicTs(0),
 | |
|           false,
 | |
|           stmt_rollback_info,
 | |
|           trace_id,
 | |
|           xid));
 | |
|   EXPECT_EQ(true, trans_commit_request_msg.is_valid());
 | |
| 
 | |
|   // OB_TRANS_COMMIT_RESPONSE
 | |
|   ObTransMsg trans_commit_response_msg;
 | |
|   msg_type = OB_TRANS_COMMIT_RESPONSE;
 | |
|   trans_time = -1;
 | |
|   EXPECT_EQ(OB_INVALID_ARGUMENT,
 | |
|       trans_commit_response_msg.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           parms,
 | |
|           observer_,
 | |
|           status,
 | |
|           commit_times,
 | |
|           need_wait_interval_us));
 | |
|   trans_time = 1;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       trans_commit_response_msg.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           parms,
 | |
|           observer_,
 | |
|           status,
 | |
|           commit_times,
 | |
|           need_wait_interval_us));
 | |
|   EXPECT_EQ(OB_INIT_TWICE,
 | |
|       trans_commit_response_msg.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           parms,
 | |
|           observer_,
 | |
|           status,
 | |
|           commit_times,
 | |
|           need_wait_interval_us));
 | |
|   EXPECT_EQ(true, trans_commit_response_msg.is_valid());
 | |
| 
 | |
|   // OB_TRANS_ABORT_REQUEST
 | |
|   msg_type = OB_TRANS_STMT_ROLLBACK_REQUEST;
 | |
|   ObTransMsg trans_abort_request_msg;
 | |
|   EXPECT_EQ(OB_INVALID_ARGUMENT,
 | |
|       trans_abort_request_msg.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           scheduler,
 | |
|           coordinator,
 | |
|           participants,
 | |
|           parms,
 | |
|           observer_,
 | |
|           cache,
 | |
|           commit_times,
 | |
|           MonotonicTs(0),
 | |
|           false,
 | |
|           stmt_rollback_info,
 | |
|           trace_id,
 | |
|           xid));
 | |
|   msg_type = OB_TRANS_ABORT_REQUEST;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       trans_abort_request_msg.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           scheduler,
 | |
|           coordinator,
 | |
|           participants,
 | |
|           parms,
 | |
|           observer_,
 | |
|           cache,
 | |
|           commit_times,
 | |
|           MonotonicTs(0),
 | |
|           false,
 | |
|           stmt_rollback_info,
 | |
|           trace_id,
 | |
|           xid));
 | |
|   EXPECT_EQ(OB_INIT_TWICE,
 | |
|       trans_abort_request_msg.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           scheduler,
 | |
|           coordinator,
 | |
|           participants,
 | |
|           parms,
 | |
|           observer_,
 | |
|           cache,
 | |
|           commit_times,
 | |
|           MonotonicTs(0),
 | |
|           false,
 | |
|           stmt_rollback_info,
 | |
|           trace_id,
 | |
|           xid));
 | |
|   EXPECT_EQ(true, trans_abort_request_msg.is_valid());
 | |
| 
 | |
|   // OB_TRANS_ABORT_RESPONSE
 | |
|   ObTransMsg trans_abort_response_msg;
 | |
|   msg_type = OB_TRANS_ABORT_RESPONSE;
 | |
|   trans_time = -1;
 | |
|   EXPECT_EQ(OB_INVALID_ARGUMENT,
 | |
|       trans_abort_response_msg.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           parms,
 | |
|           observer_,
 | |
|           status,
 | |
|           commit_times,
 | |
|           need_wait_interval_us));
 | |
|   trans_time = 1;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       trans_abort_response_msg.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           parms,
 | |
|           observer_,
 | |
|           status,
 | |
|           commit_times,
 | |
|           need_wait_interval_us));
 | |
|   EXPECT_EQ(OB_INIT_TWICE,
 | |
|       trans_abort_response_msg.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           parms,
 | |
|           observer_,
 | |
|           status,
 | |
|           commit_times,
 | |
|           need_wait_interval_us));
 | |
|   EXPECT_EQ(true, trans_abort_response_msg.is_valid());
 | |
| }
 | |
| 
 | |
| // test OB_TRANS_ERROR_MSG
 | |
| TEST_F(TestObTransMsg, trans_error_msg)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
| 
 | |
|   int64_t msg_type = OB_TRANS_MSG_UNKNOWN;
 | |
|   int64_t error_msg_type = OB_TRANS_MSG_UNKNOWN;
 | |
|   ObTransID trans_id(observer_);
 | |
|   ObPartitionKey partition_key(VALID_TABLE_ID, VALID_PARTITION_ID, VALID_PARTITION_COUNT);
 | |
|   const ObPartitionKey& sender = partition_key;
 | |
|   const int32_t status = OB_SUCCESS;
 | |
|   const ObStmtRollbackInfo stmt_rollback_info;
 | |
| 
 | |
|   ObTransMsg error_msg;
 | |
|   EXPECT_EQ(OB_INVALID_ARGUMENT,
 | |
|       error_msg.init(msg_type, error_msg_type, TestObTransMsg::TENANT_ID, trans_id, sender, observer_, status, 1, 1));
 | |
|   msg_type = OB_TRANS_ERROR_MSG;
 | |
|   // error_msg_type = OB_TRANS_MSG_TYPE_UNKNOWN
 | |
|   EXPECT_EQ(OB_INVALID_ARGUMENT,
 | |
|       error_msg.init(msg_type, error_msg_type, TestObTransMsg::TENANT_ID, trans_id, sender, observer_, status, 1, 1));
 | |
|   ASSERT_FALSE(error_msg.is_valid());
 | |
|   error_msg.reset();
 | |
| 
 | |
|   error_msg_type = OB_TRANS_STMT_CREATE_CTX_REQUEST;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       error_msg.init(msg_type, error_msg_type, TestObTransMsg::TENANT_ID, trans_id, sender, observer_, status, 1, 1));
 | |
|   EXPECT_EQ(true, error_msg.is_valid());
 | |
|   error_msg.reset();
 | |
| 
 | |
|   error_msg_type = OB_TRANS_STMT_CREATE_CTX_RESPONSE;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       error_msg.init(msg_type, error_msg_type, TestObTransMsg::TENANT_ID, trans_id, sender, observer_, status, 1, 1));
 | |
|   EXPECT_EQ(true, error_msg.is_valid());
 | |
|   error_msg.reset();
 | |
| 
 | |
|   error_msg_type = OB_TRANS_STMT_ROLLBACK_REQUEST;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       error_msg.init(msg_type, error_msg_type, TestObTransMsg::TENANT_ID, trans_id, sender, observer_, status, 1, 1));
 | |
|   EXPECT_EQ(true, error_msg.is_valid());
 | |
|   error_msg.reset();
 | |
| 
 | |
|   error_msg_type = OB_TRANS_STMT_ROLLBACK_RESPONSE;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       error_msg.init(msg_type, error_msg_type, TestObTransMsg::TENANT_ID, trans_id, sender, observer_, status, 1, 1));
 | |
|   EXPECT_EQ(true, error_msg.is_valid());
 | |
|   error_msg.reset();
 | |
| 
 | |
|   error_msg_type = OB_TRANS_COMMIT_REQUEST;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       error_msg.init(msg_type, error_msg_type, TestObTransMsg::TENANT_ID, trans_id, sender, observer_, status, 1, 1));
 | |
|   EXPECT_EQ(true, error_msg.is_valid());
 | |
|   error_msg.reset();
 | |
| 
 | |
|   error_msg_type = OB_TRANS_COMMIT_RESPONSE;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       error_msg.init(msg_type, error_msg_type, TestObTransMsg::TENANT_ID, trans_id, sender, observer_, status, 1, 1));
 | |
|   EXPECT_EQ(true, error_msg.is_valid());
 | |
|   error_msg.reset();
 | |
| 
 | |
|   error_msg_type = OB_TRANS_ABORT_REQUEST;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       error_msg.init(msg_type, error_msg_type, TestObTransMsg::TENANT_ID, trans_id, sender, observer_, status, 1, 1));
 | |
|   EXPECT_EQ(true, error_msg.is_valid());
 | |
|   error_msg.reset();
 | |
| 
 | |
|   error_msg_type = OB_TRANS_ABORT_RESPONSE;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       error_msg.init(msg_type, error_msg_type, TestObTransMsg::TENANT_ID, trans_id, sender, observer_, status, 1, 1));
 | |
|   EXPECT_EQ(true, error_msg.is_valid());
 | |
|   error_msg.reset();
 | |
| 
 | |
|   error_msg_type = OB_TRANS_2PC_PREPARE_REQUEST;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       error_msg.init(msg_type, error_msg_type, TestObTransMsg::TENANT_ID, trans_id, sender, observer_, status, 1, 1));
 | |
|   EXPECT_EQ(true, error_msg.is_valid());
 | |
|   error_msg.reset();
 | |
| 
 | |
|   error_msg_type = OB_TRANS_2PC_PREPARE_RESPONSE;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       error_msg.init(msg_type, error_msg_type, TestObTransMsg::TENANT_ID, trans_id, sender, observer_, status, 1, 1));
 | |
|   EXPECT_EQ(true, error_msg.is_valid());
 | |
|   error_msg.reset();
 | |
| 
 | |
|   error_msg_type = OB_TRANS_2PC_COMMIT_REQUEST;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       error_msg.init(msg_type, error_msg_type, TestObTransMsg::TENANT_ID, trans_id, sender, observer_, status, 1, 1));
 | |
|   EXPECT_EQ(true, error_msg.is_valid());
 | |
|   error_msg.reset();
 | |
| 
 | |
|   error_msg_type = OB_TRANS_2PC_COMMIT_RESPONSE;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       error_msg.init(msg_type, error_msg_type, TestObTransMsg::TENANT_ID, trans_id, sender, observer_, status, 1, 1));
 | |
|   EXPECT_EQ(true, error_msg.is_valid());
 | |
|   error_msg.reset();
 | |
| 
 | |
|   error_msg_type = OB_TRANS_2PC_ABORT_REQUEST;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       error_msg.init(msg_type, error_msg_type, TestObTransMsg::TENANT_ID, trans_id, sender, observer_, status, 1, 1));
 | |
|   EXPECT_EQ(true, error_msg.is_valid());
 | |
|   error_msg.reset();
 | |
| 
 | |
|   error_msg_type = OB_TRANS_2PC_ABORT_RESPONSE;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       error_msg.init(msg_type, error_msg_type, TestObTransMsg::TENANT_ID, trans_id, sender, observer_, status, 1, 1));
 | |
|   EXPECT_EQ(true, error_msg.is_valid());
 | |
|   error_msg.reset();
 | |
| 
 | |
|   error_msg_type = OB_TRANS_2PC_CLEAR_REQUEST;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       error_msg.init(msg_type, error_msg_type, TestObTransMsg::TENANT_ID, trans_id, sender, observer_, status, 1, 1));
 | |
|   EXPECT_EQ(true, error_msg.is_valid());
 | |
|   error_msg.reset();
 | |
| 
 | |
|   error_msg_type = OB_TRANS_2PC_CLEAR_RESPONSE;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       error_msg.init(msg_type, error_msg_type, TestObTransMsg::TENANT_ID, trans_id, sender, observer_, status, 1, 1));
 | |
|   EXPECT_EQ(true, error_msg.is_valid());
 | |
|   error_msg.reset();
 | |
| }
 | |
| 
 | |
| // OB_TRANS_2PC_PREPARE_REQUEST/RESPONSE
 | |
| // OB_TRANS_2PC_COMMIT_REQUEST/RESPONSE
 | |
| TEST_F(TestObTransMsg, trans_2pc_prepare_commit_request_response_msg)
 | |
| {
 | |
|   TRANS_LOG(INFO, "called", "func", test_info_->name());
 | |
| 
 | |
|   const int64_t PARTICIPANT_NUM = 10;
 | |
|   ObTransID trans_id(observer_);
 | |
|   ObPartitionArray participants;
 | |
|   for (int64_t i = 0; i < PARTICIPANT_NUM; ++i) {
 | |
|     ObPartitionKey partition_key(VALID_TABLE_ID + i, VALID_PARTITION_ID, VALID_PARTITION_COUNT);
 | |
|     ASSERT_EQ(OB_SUCCESS, participants.push_back(partition_key));
 | |
|   }
 | |
|   const ObPartitionKey& sender = participants.at(0);
 | |
|   const ObPartitionKey& receiver = participants.at(1);
 | |
|   const ObAddr& scheduler = observer_;
 | |
|   const ObPartitionKey coordinator = participants.at(0);
 | |
| 
 | |
|   // create an object of ObStartTransParm
 | |
|   ObStartTransParam parms;
 | |
|   parms.set_access_mode(ObTransAccessMode::READ_ONLY);
 | |
|   parms.set_type(ObTransType::TRANS_USER);
 | |
|   parms.set_isolation(ObTransIsolation::READ_COMMITED);
 | |
|   int64_t trans_time = 9870;
 | |
|   const int32_t status = OB_SUCCESS;
 | |
|   const int64_t request_id = ObClockGenerator::getClock();
 | |
|   const int64_t prepare_log_id = 100;
 | |
|   const int64_t trans_version = ObClockGenerator::getClock();
 | |
|   int64_t state = Ob2PCState::PREPARE;
 | |
|   const PartitionLogInfoArray arr;
 | |
|   const ObStmtRollbackInfo stmt_rollback_info;
 | |
|   const ObString trace_id = "trance_id=xxx";
 | |
|   const ObXATransID xid;
 | |
|   const bool is_xa_prepare = false;
 | |
| 
 | |
|   // OB_TRANS_2PC_PREPARE_REQUEST
 | |
|   int64_t msg_type = OB_TRANS_STMT_ROLLBACK_REQUEST;
 | |
|   ObTransMsg trans_2pc_prepare_request;
 | |
|   EXPECT_EQ(OB_INVALID_ARGUMENT,
 | |
|       trans_2pc_prepare_request.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           scheduler,
 | |
|           coordinator,
 | |
|           participants,
 | |
|           parms,
 | |
|           observer_,
 | |
|           status,
 | |
|           request_id,
 | |
|           MonotonicTs(0),
 | |
|           arr,
 | |
|           stmt_rollback_info,
 | |
|           trace_id,
 | |
|           xid,
 | |
|           is_xa_prepare));
 | |
|   msg_type = OB_TRANS_2PC_PREPARE_REQUEST;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       trans_2pc_prepare_request.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           scheduler,
 | |
|           coordinator,
 | |
|           participants,
 | |
|           parms,
 | |
|           observer_,
 | |
|           status,
 | |
|           request_id,
 | |
|           MonotonicTs(0),
 | |
|           arr,
 | |
|           stmt_rollback_info,
 | |
|           trace_id,
 | |
|           xid,
 | |
|           is_xa_prepare));
 | |
|   EXPECT_EQ(OB_INIT_TWICE,
 | |
|       trans_2pc_prepare_request.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           scheduler,
 | |
|           coordinator,
 | |
|           participants,
 | |
|           parms,
 | |
|           observer_,
 | |
|           status,
 | |
|           request_id,
 | |
|           MonotonicTs(0),
 | |
|           arr,
 | |
|           stmt_rollback_info,
 | |
|           trace_id,
 | |
|           xid,
 | |
|           is_xa_prepare));
 | |
|   EXPECT_EQ(true, trans_2pc_prepare_request.is_valid());
 | |
| 
 | |
|   // OB_TRANS_2PC_PREPARE_RESPONSE
 | |
|   ObTransMsg trans_2pc_prepare_response;
 | |
|   msg_type = OB_TRANS_2PC_PREPARE_RESPONSE;
 | |
|   PartitionLogInfoArray tmp_array;
 | |
|   trans_time = -1;
 | |
|   EXPECT_EQ(OB_INVALID_ARGUMENT,
 | |
|       trans_2pc_prepare_response.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           scheduler,
 | |
|           coordinator,
 | |
|           participants,
 | |
|           parms,
 | |
|           prepare_log_id,
 | |
|           ObClockGenerator::getClock(),
 | |
|           observer_,
 | |
|           status,
 | |
|           state,
 | |
|           trans_version,
 | |
|           request_id,
 | |
|           tmp_array,
 | |
|           0,
 | |
|           trace_id,
 | |
|           xid,
 | |
|           is_xa_prepare));
 | |
|   trans_time = 1;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       trans_2pc_prepare_response.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           scheduler,
 | |
|           coordinator,
 | |
|           participants,
 | |
|           parms,
 | |
|           prepare_log_id,
 | |
|           ObClockGenerator::getClock(),
 | |
|           observer_,
 | |
|           status,
 | |
|           state,
 | |
|           trans_version,
 | |
|           request_id,
 | |
|           tmp_array,
 | |
|           0,
 | |
|           trace_id,
 | |
|           xid,
 | |
|           is_xa_prepare));
 | |
|   EXPECT_EQ(OB_INIT_TWICE,
 | |
|       trans_2pc_prepare_response.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           scheduler,
 | |
|           coordinator,
 | |
|           participants,
 | |
|           parms,
 | |
|           prepare_log_id,
 | |
|           ObClockGenerator::getClock(),
 | |
|           observer_,
 | |
|           status,
 | |
|           state,
 | |
|           trans_version,
 | |
|           request_id,
 | |
|           tmp_array,
 | |
|           0,
 | |
|           trace_id,
 | |
|           xid,
 | |
|           is_xa_prepare));
 | |
| 
 | |
|   // OB_TRANS_2PC_COMMIT_REQUEST
 | |
|   ObPartitionLogInfo partition_log_info(receiver, prepare_log_id, ObClockGenerator::getClock());
 | |
|   PartitionLogInfoArray partition_log_info_arr;
 | |
|   EXPECT_EQ(OB_SUCCESS, partition_log_info_arr.push_back(partition_log_info));
 | |
| 
 | |
|   msg_type = OB_TRANS_ABORT_REQUEST;
 | |
|   ObTransMsg trans_2pc_commit_request;
 | |
|   EXPECT_EQ(OB_INVALID_ARGUMENT,
 | |
|       trans_2pc_commit_request.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           scheduler,
 | |
|           coordinator,
 | |
|           participants,
 | |
|           parms,
 | |
|           trans_version,
 | |
|           observer_,
 | |
|           request_id,
 | |
|           partition_log_info_arr,
 | |
|           OB_SUCCESS));
 | |
| 
 | |
|   msg_type = OB_TRANS_2PC_COMMIT_REQUEST;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       trans_2pc_commit_request.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           scheduler,
 | |
|           coordinator,
 | |
|           participants,
 | |
|           parms,
 | |
|           trans_version,
 | |
|           observer_,
 | |
|           request_id,
 | |
|           partition_log_info_arr,
 | |
|           OB_SUCCESS));
 | |
|   EXPECT_EQ(OB_INIT_TWICE,
 | |
|       trans_2pc_commit_request.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           scheduler,
 | |
|           coordinator,
 | |
|           participants,
 | |
|           parms,
 | |
|           trans_version,
 | |
|           observer_,
 | |
|           request_id,
 | |
|           partition_log_info_arr,
 | |
|           OB_SUCCESS));
 | |
|   EXPECT_EQ(true, trans_2pc_commit_request.is_valid());
 | |
| 
 | |
|   // OB_TRANS_2PC_COMMIT_RESPONSE
 | |
|   ObTransMsg trans_2pc_commit_response;
 | |
|   msg_type = OB_TRANS_2PC_COMMIT_RESPONSE;
 | |
|   trans_time = -1;
 | |
|   EXPECT_EQ(OB_INVALID_ARGUMENT,
 | |
|       trans_2pc_commit_response.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           scheduler,
 | |
|           coordinator,
 | |
|           participants,
 | |
|           parms,
 | |
|           trans_version,
 | |
|           observer_,
 | |
|           request_id,
 | |
|           partition_log_info_arr,
 | |
|           OB_SUCCESS));
 | |
|   trans_time = 1;
 | |
|   EXPECT_EQ(OB_SUCCESS,
 | |
|       trans_2pc_commit_response.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           scheduler,
 | |
|           coordinator,
 | |
|           participants,
 | |
|           parms,
 | |
|           trans_version,
 | |
|           observer_,
 | |
|           request_id,
 | |
|           partition_log_info_arr,
 | |
|           OB_SUCCESS));
 | |
|   EXPECT_EQ(OB_INIT_TWICE,
 | |
|       trans_2pc_commit_response.init(TestObTransMsg::TENANT_ID,
 | |
|           trans_id,
 | |
|           msg_type,
 | |
|           trans_time,
 | |
|           sender,
 | |
|           receiver,
 | |
|           scheduler,
 | |
|           coordinator,
 | |
|           participants,
 | |
|           parms,
 | |
|           trans_version,
 | |
|           observer_,
 | |
|           request_id,
 | |
|           partition_log_info_arr,
 | |
|           OB_SUCCESS));
 | |
|   EXPECT_EQ(true, trans_2pc_commit_response.is_valid());
 | |
| }
 | |
| }  // 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_msg.log", true);
 | |
|   logger.set_log_level(OB_LOG_LEVEL_INFO);
 | |
|   testing::InitGoogleTest(&argc, argv);
 | |
|   ret = RUN_ALL_TESTS();
 | |
|   return ret;
 | |
| }
 | 
