257 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			257 lines
		
	
	
		
			12 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 "lib/ob_errno.h"
 | |
| #include <gtest/gtest.h>
 | |
| #include <gmock/gmock.h>
 | |
| #define private public
 | |
| #define protected public
 | |
| #include "share/deadlock/ob_deadlock_key_wrapper.h"
 | |
| #include "share/deadlock/ob_deadlock_detector_mgr.h"
 | |
| #include "share/deadlock/test/test_key.h"
 | |
| #include <string>
 | |
| #include <iostream>
 | |
| #include <thread>
 | |
| #include <chrono>
 | |
| #include <algorithm>
 | |
| #include "share/deadlock/ob_lcl_scheme/ob_lcl_batch_sender_thread.h"
 | |
| #include "share/deadlock/ob_lcl_scheme/ob_lcl_message.h"
 | |
| #include "storage/tx/ob_trans_define_v4.h"
 | |
| 
 | |
| namespace oceanbase {
 | |
| namespace unittest {
 | |
| 
 | |
| using namespace common;
 | |
| using namespace share::detector;
 | |
| using namespace std;
 | |
| 
 | |
| 
 | |
| class TestLCLMsgDrop : public ::testing::Test {
 | |
| public:
 | |
|   TestLCLMsgDrop() {}
 | |
|   ~TestLCLMsgDrop() {}
 | |
|   virtual void SetUp() { share::ObTenantEnv::get_tenant_local()->id_ = 1; }
 | |
|   virtual void TearDown() {}
 | |
|   static ObLCLBatchSenderThread batch_sender_;
 | |
|   int port;
 | |
| };
 | |
| ObLCLBatchSenderThread TestLCLMsgDrop::batch_sender_(nullptr);
 | |
| 
 | |
| TEST_F(TestLCLMsgDrop, always_keep) {// the first 2048 will always success
 | |
|   ASSERT_EQ(OB_SUCCESS, batch_sender_.init());
 | |
|   ASSERT_EQ(OB_SUCCESS, batch_sender_.start());
 | |
|   ATOMIC_STORE(&batch_sender_.allow_send_, false);
 | |
|   ObLCLMessage mock_message;
 | |
|   ObAddr mock_addr(ObAddr::VER::IPV4, "127.0.0.1", 0);
 | |
|   UserBinaryKey mock_self_key, mock_dest_key;
 | |
|   ObLCLLabel mock_lcl_label(1, ObDetectorPriority(1));
 | |
|   mock_lcl_label.addr_ = ObAddr(ObAddr::VER::IPV4, "127.0.0.1", 1);
 | |
|   ASSERT_EQ(OB_SUCCESS, mock_self_key.set_user_key(transaction::ObTransID(1)));
 | |
|   ASSERT_EQ(OB_SUCCESS, mock_dest_key.set_user_key(transaction::ObTransID(1)));
 | |
| 
 | |
|   for (int i = 0; i < LCL_MSG_CACHE_LIMIT / 2; ++i) {
 | |
|     mock_addr.set_port(i + 1);
 | |
|     ASSERT_EQ(OB_SUCCESS, mock_message.set_args(mock_addr,
 | |
|                                                 mock_dest_key,
 | |
|                                                 ObAddr(ObAddr::VER::IPV4, "127.0.0.1", 1),
 | |
|                                                 mock_self_key,
 | |
|                                                 0,
 | |
|                                                 mock_lcl_label,
 | |
|                                                 1));
 | |
|     ObDependencyResource mock_resource(mock_addr, mock_dest_key);
 | |
|     ObDependencyResource mock_resource2(mock_addr, mock_dest_key);
 | |
|     OB_ASSERT(mock_resource == mock_resource2);
 | |
|     ASSERT_EQ(OB_SUCCESS, batch_sender_.cache_msg(mock_resource, mock_message));
 | |
|     ObLCLMessage read_message;
 | |
|     ASSERT_EQ(OB_SUCCESS, batch_sender_.lcl_msg_map_.get(mock_resource, read_message));
 | |
|     DETECT_LOG(INFO, "print mock resource message", K(read_message));
 | |
|   }
 | |
| }
 | |
| 
 | |
| TEST_F(TestLCLMsgDrop, random_drop_25_percentage) {
 | |
|   int ret = OB_SUCCESS;
 | |
|   ObLCLMessage mock_message;
 | |
|   ObAddr mock_addr(ObAddr::VER::IPV4, "127.0.0.1", 0);
 | |
|   UserBinaryKey mock_self_key, mock_dest_key;
 | |
|   ObLCLLabel mock_lcl_label(1, ObDetectorPriority(1));
 | |
|   mock_lcl_label.addr_ = ObAddr(ObAddr::VER::IPV4, "127.0.0.1", 1);
 | |
|   ASSERT_EQ(OB_SUCCESS, mock_self_key.set_user_key(transaction::ObTransID(1)));
 | |
|   ASSERT_EQ(OB_SUCCESS, mock_dest_key.set_user_key(transaction::ObTransID(1)));
 | |
|   for (int i = LCL_MSG_CACHE_LIMIT / 2; i < LCL_MSG_CACHE_LIMIT / 2 + LCL_MSG_CACHE_LIMIT / 8; ++i) {
 | |
|     mock_addr.set_port(i + 1);
 | |
|     ASSERT_EQ(OB_SUCCESS, mock_message.set_args(mock_addr,
 | |
|                                                 mock_dest_key,
 | |
|                                                 ObAddr(ObAddr::VER::IPV4, "127.0.0.1", 1),
 | |
|                                                 mock_self_key,
 | |
|                                                 0,
 | |
|                                                 mock_lcl_label,
 | |
|                                                 1));
 | |
|     ObDependencyResource mock_resource(mock_addr, mock_dest_key);
 | |
|     ASSERT_EQ(OB_SUCCESS, batch_sender_.lcl_msg_map_.insert(mock_resource, mock_message));
 | |
|   }
 | |
| 
 | |
|   mock_addr.set_port(65535);
 | |
|   int fail_times = 0, succ_times = 0;
 | |
|   for (int i = 0; i < 100000; ++i) {
 | |
|     ASSERT_EQ(OB_SUCCESS, mock_message.set_args(mock_addr,
 | |
|                                                 mock_dest_key,
 | |
|                                                 ObAddr(ObAddr::VER::IPV4, "127.0.0.1", 1),
 | |
|                                                 mock_self_key,
 | |
|                                                 0,
 | |
|                                                 mock_lcl_label,
 | |
|                                                 1));
 | |
|     ObDependencyResource mock_resource(mock_addr, mock_dest_key);
 | |
|     if (OB_SUCC(batch_sender_.cache_msg(mock_resource, mock_message))) {
 | |
|       ++succ_times;
 | |
|       batch_sender_.lcl_msg_map_.erase(mock_resource);
 | |
|     } else {
 | |
|       ++fail_times;
 | |
|     }
 | |
|   }
 | |
|   int fail_percentage = fail_times * 100 / (succ_times + fail_times);
 | |
|   ASSERT_GE(fail_percentage, 20);
 | |
|   ASSERT_LE(fail_percentage, 30);
 | |
|   DETECT_LOG(INFO, "print drop percentage", K(fail_percentage));
 | |
| }
 | |
| 
 | |
| TEST_F(TestLCLMsgDrop, random_drop_75_percentage) {
 | |
|   int ret = OB_SUCCESS;
 | |
|   ObLCLMessage mock_message;
 | |
|   ObAddr mock_addr(ObAddr::VER::IPV4, "127.0.0.1", 0);
 | |
|   UserBinaryKey mock_self_key, mock_dest_key;
 | |
|   ObLCLLabel mock_lcl_label(1, ObDetectorPriority(1));
 | |
|   mock_lcl_label.addr_ = ObAddr(ObAddr::VER::IPV4, "127.0.0.1", 1);
 | |
|   ASSERT_EQ(OB_SUCCESS, mock_self_key.set_user_key(transaction::ObTransID(1)));
 | |
|   ASSERT_EQ(OB_SUCCESS, mock_dest_key.set_user_key(transaction::ObTransID(1)));
 | |
|   for (int i = LCL_MSG_CACHE_LIMIT / 2 + LCL_MSG_CACHE_LIMIT / 8; i < LCL_MSG_CACHE_LIMIT / 2 + LCL_MSG_CACHE_LIMIT * 3 / 8; ++i) {
 | |
|     mock_addr.set_port(i + 1);
 | |
|     ASSERT_EQ(OB_SUCCESS, mock_message.set_args(mock_addr,
 | |
|                                                 mock_dest_key,
 | |
|                                                 ObAddr(ObAddr::VER::IPV4, "127.0.0.1", 1),
 | |
|                                                 mock_self_key,
 | |
|                                                 0,
 | |
|                                                 mock_lcl_label,
 | |
|                                                 1));
 | |
|     ObDependencyResource mock_resource(mock_addr, mock_dest_key);
 | |
|     ASSERT_EQ(OB_SUCCESS, batch_sender_.lcl_msg_map_.insert(mock_resource, mock_message));
 | |
|   }
 | |
| 
 | |
|   mock_addr.set_port(65535);
 | |
|   int fail_times = 0, succ_times = 0;
 | |
|   for (int i = 0; i < 100000; ++i) {
 | |
|     ASSERT_EQ(OB_SUCCESS, mock_message.set_args(mock_addr,
 | |
|                                                 mock_dest_key,
 | |
|                                                 ObAddr(ObAddr::VER::IPV4, "127.0.0.1", 1),
 | |
|                                                 mock_self_key,
 | |
|                                                 0,
 | |
|                                                 mock_lcl_label,
 | |
|                                                 1));
 | |
|     ObDependencyResource mock_resource(mock_addr, mock_dest_key);
 | |
|     if (OB_SUCC(batch_sender_.cache_msg(mock_resource, mock_message))) {
 | |
|       ++succ_times;
 | |
|       batch_sender_.lcl_msg_map_.erase(mock_resource);
 | |
|     } else {
 | |
|       ++fail_times;
 | |
|     }
 | |
|   }
 | |
|   int fail_percentage = fail_times * 100 / (succ_times + fail_times);
 | |
|   ASSERT_GE(fail_percentage, 70);
 | |
|   ASSERT_LE(fail_percentage, 80);
 | |
|   DETECT_LOG(INFO, "print drop percentage", K(fail_percentage));
 | |
| }
 | |
| 
 | |
| TEST_F(TestLCLMsgDrop, always_drop) {
 | |
|   int ret = OB_SUCCESS;
 | |
|   ObLCLMessage mock_message;
 | |
|   ObAddr mock_addr(ObAddr::VER::IPV4, "127.0.0.1", 0);
 | |
|   UserBinaryKey mock_self_key, mock_dest_key;
 | |
|   ObLCLLabel mock_lcl_label(1, ObDetectorPriority(1));
 | |
|   mock_lcl_label.addr_ = ObAddr(ObAddr::VER::IPV4, "127.0.0.1", 1);
 | |
|   ASSERT_EQ(OB_SUCCESS, mock_self_key.set_user_key(transaction::ObTransID(1)));
 | |
|   ASSERT_EQ(OB_SUCCESS, mock_dest_key.set_user_key(transaction::ObTransID(1)));
 | |
|   for (int i = LCL_MSG_CACHE_LIMIT / 2 + LCL_MSG_CACHE_LIMIT * 3 / 8; i < LCL_MSG_CACHE_LIMIT; ++i) {
 | |
|     mock_addr.set_port(i + 1);
 | |
|     ASSERT_EQ(OB_SUCCESS, mock_message.set_args(mock_addr,
 | |
|                                                 mock_dest_key,
 | |
|                                                 ObAddr(ObAddr::VER::IPV4, "127.0.0.1", 1),
 | |
|                                                 mock_self_key,
 | |
|                                                 0,
 | |
|                                                 mock_lcl_label,
 | |
|                                                 1));
 | |
|     ObDependencyResource mock_resource(mock_addr, mock_dest_key);
 | |
|     ASSERT_EQ(OB_SUCCESS, batch_sender_.lcl_msg_map_.insert(mock_resource, mock_message));
 | |
|   }
 | |
| 
 | |
|   mock_addr.set_port(65535);
 | |
|   for (int i = 0; i < 100000; ++i) {
 | |
|     ASSERT_EQ(OB_SUCCESS, mock_message.set_args(mock_addr,
 | |
|                                                 mock_dest_key,
 | |
|                                                 ObAddr(ObAddr::VER::IPV4, "127.0.0.1", 1),
 | |
|                                                 mock_self_key,
 | |
|                                                 0,
 | |
|                                                 mock_lcl_label,
 | |
|                                                 1));
 | |
|     ObDependencyResource mock_resource(mock_addr, mock_dest_key);
 | |
|     ASSERT_EQ(OB_BUF_NOT_ENOUGH, batch_sender_.cache_msg(mock_resource, mock_message));
 | |
|   }
 | |
| }
 | |
| 
 | |
| TEST_F(TestLCLMsgDrop, message_merge_when_reach_limit) {
 | |
|   int ret = OB_SUCCESS;
 | |
|   ObLCLMessage mock_message;
 | |
|   ObLCLMessage read_message;
 | |
|   ObAddr mock_addr(ObAddr::VER::IPV4, "127.0.0.1", 1);
 | |
|   UserBinaryKey mock_self_key, mock_dest_key;
 | |
|   ObLCLLabel mock_lcl_label(0, ObDetectorPriority(0));
 | |
|   mock_lcl_label.addr_ = ObAddr(ObAddr::VER::IPV4, "127.0.0.1", 1);
 | |
|   ASSERT_EQ(OB_SUCCESS, mock_self_key.set_user_key(transaction::ObTransID(1)));
 | |
|   ASSERT_EQ(OB_SUCCESS, mock_dest_key.set_user_key(transaction::ObTransID(1)));
 | |
| 
 | |
|   ASSERT_EQ(OB_SUCCESS, mock_message.set_args(mock_addr,
 | |
|                                               mock_dest_key,
 | |
|                                               ObAddr(ObAddr::VER::IPV4, "127.0.0.1", 1),
 | |
|                                               mock_self_key,
 | |
|                                               0,
 | |
|                                               mock_lcl_label,
 | |
|                                               1));
 | |
|   ObDependencyResource mock_resource(mock_addr, mock_dest_key);
 | |
|   ASSERT_EQ(OB_SUCCESS, batch_sender_.lcl_msg_map_.get(mock_resource, read_message));
 | |
|   DETECT_LOG(INFO, "print mock resource message", K(read_message));
 | |
|   ASSERT_EQ(OB_SUCCESS, batch_sender_.cache_msg(mock_resource, mock_message));
 | |
|   ASSERT_EQ(OB_SUCCESS, batch_sender_.lcl_msg_map_.get(mock_resource, read_message));
 | |
|   ASSERT_EQ(0, read_message.label_.id_);
 | |
| 
 | |
|   new (&mock_lcl_label) ObLCLLabel(1, ObDetectorPriority(1));
 | |
|   mock_lcl_label.addr_ = ObAddr(ObAddr::VER::IPV4, "127.0.0.1", 1);
 | |
|   ASSERT_EQ(OB_SUCCESS, mock_message.set_args(mock_addr,
 | |
|                                               mock_dest_key,
 | |
|                                               ObAddr(ObAddr::VER::IPV4, "127.0.0.1", 1),
 | |
|                                               mock_self_key,
 | |
|                                               1,
 | |
|                                               mock_lcl_label,
 | |
|                                               1));
 | |
|   ASSERT_EQ(OB_SUCCESS, batch_sender_.cache_msg(mock_resource, mock_message));
 | |
|   ASSERT_EQ(OB_SUCCESS, batch_sender_.lcl_msg_map_.get(mock_resource, read_message));
 | |
|   ASSERT_EQ(1, read_message.label_.id_);
 | |
| }
 | |
| 
 | |
| }// namespace unittest
 | |
| }// namespace oceanbase
 | |
| 
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|   system("rm -rf test_lcl_message_drop.log");
 | |
|   oceanbase::common::ObLogger &logger = oceanbase::common::ObLogger::get_logger();
 | |
|   logger.set_file_name("test_lcl_message_drop.log", false);
 | |
|   logger.set_log_level(OB_LOG_LEVEL_DEBUG);
 | |
|   testing::InitGoogleTest(&argc, argv);
 | |
|   return RUN_ALL_TESTS();
 | |
| } | 
