 e0b1dda713
			
		
	
	e0b1dda713
	
	
	
		
			
			Co-authored-by: rolandqi <qikai456@126.com> Co-authored-by: yangzhifeng <yangzhifeng83@gmail.com>
		
			
				
	
	
		
			775 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			775 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /**
 | |
|  * Copyright (c) 2023 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.
 | |
|  */
 | |
| 
 | |
| #define USING_LOG_PREFIX SHARE
 | |
| #define private public
 | |
| #define protected public
 | |
| #include "share/ash/ob_active_sess_hist_list.h"
 | |
| #undef private
 | |
| #undef public
 | |
| #include <gtest/gtest.h>
 | |
| 
 | |
| namespace oceanbase
 | |
| {
 | |
| namespace share
 | |
| {
 | |
| using namespace common;
 | |
| 
 | |
| class TestAshIndex : public ::testing::Test
 | |
| {
 | |
| public:
 | |
|   virtual void SetUp();
 | |
|   virtual void TearDown();
 | |
|   void reset_ash_list()
 | |
|   {
 | |
|     ObActiveSessHistList::get_instance().write_pos_ = 0;
 | |
|     ObActiveSessHistList::get_instance().list_.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, ObActiveSessHistList::get_instance().init());
 | |
|   }
 | |
|   void reset_ash_list_with_write_pos(int64_t write_pos)
 | |
|   {
 | |
|     ObActiveSessHistList::get_instance().write_pos_ = 0;
 | |
|     ObActiveSessHistList::get_instance().list_.reset();
 | |
|     ASSERT_EQ(OB_SUCCESS, ObActiveSessHistList::get_instance().init());
 | |
|     ObActiveSessHistList::get_instance().write_pos_ += write_pos;
 | |
|   }
 | |
|   void push_back_sample_time(int64_t sample_time)
 | |
|   {
 | |
|     int64_t write_pos = ObActiveSessHistList::get_instance().write_pos();
 | |
|     ActiveSessionStat stat;
 | |
|     stat.sample_time_ = sample_time;
 | |
|     ObActiveSessHistList::get_instance().add(stat);
 | |
|     ASSERT_EQ(ObActiveSessHistList::get_instance().write_pos(), write_pos + 1);
 | |
|   }
 | |
|   int test_body(int64_t write_pos);
 | |
|   int check_iter_valid(const ObActiveSessHistList::Iterator &iter);
 | |
| };
 | |
| 
 | |
| void TestAshIndex::SetUp()
 | |
| {
 | |
|   ASSERT_EQ(OB_SUCCESS, ObActiveSessHistList::get_instance().init());
 | |
| }
 | |
| 
 | |
| void TestAshIndex::TearDown()
 | |
| {
 | |
|   reset_ash_list();
 | |
| }
 | |
| 
 | |
| int TestAshIndex::check_iter_valid(const ObActiveSessHistList::Iterator &iter)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   if (!(iter.curr_ >= 0 && iter.end_ >= 0)) {
 | |
|     if (iter.has_next()) {
 | |
|       ret = OB_ERR_UNEXPECTED;
 | |
|     }
 | |
|   }
 | |
|   return ret;
 | |
| }
 | |
| 
 | |
| TEST_F(TestAshIndex, ash_index)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
| 
 | |
|   // empty list
 | |
|   auto iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(0, 0);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter.init_with_sample_time_index(-1, -1);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter.init_with_sample_time_index(999, 999);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
| 
 | |
|   // one node
 | |
|   push_back_sample_time(10);
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(0, 0);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(10, 10);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(9, 10);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(10, 11);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(9, 12);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
| 
 | |
|   // several node
 | |
|   reset_ash_list();
 | |
|   push_back_sample_time(8);
 | |
|   push_back_sample_time(9);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(11);
 | |
|   push_back_sample_time(12);
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(0, 0);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(10, 10);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(9, 10);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(9, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(10, 11);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(11, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(9, 12);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(12, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(11, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(9, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(7, 9);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(9, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(8, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(999, 996);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter.init_with_sample_time_index(-1, -5);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter.init_with_sample_time_index(-5, -1);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
| 
 | |
|   // timer reverse outcome is false, but should not core.
 | |
|   reset_ash_list();
 | |
|   push_back_sample_time(8);
 | |
|   push_back_sample_time(9);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(9);
 | |
|   push_back_sample_time(7);
 | |
|   push_back_sample_time(10);
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(0, 0);
 | |
|   ASSERT_EQ(OB_SUCCESS, check_iter_valid(iter));
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(10, 10);
 | |
|   ASSERT_EQ(OB_SUCCESS, check_iter_valid(iter));
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(9, 10);
 | |
|   ASSERT_EQ(OB_SUCCESS, check_iter_valid(iter));
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(10, 11);
 | |
|   ASSERT_EQ(OB_SUCCESS, check_iter_valid(iter));
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(9, 12);
 | |
|   ASSERT_EQ(OB_SUCCESS, check_iter_valid(iter));
 | |
| }
 | |
| 
 | |
| TEST_F(TestAshIndex, ash_index_ring_buffer)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
|   reset_ash_list_with_write_pos(ObActiveSessHistList::get_instance().size());
 | |
|   // empty list
 | |
|   auto iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(0, 0);
 | |
|   for (int i = 0; i < ObActiveSessHistList::get_instance().size(); i++) {
 | |
|     ASSERT_EQ(true, iter.has_next());
 | |
|     ASSERT_EQ(0, iter.next().sample_time_);
 | |
|   }
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter.init_with_sample_time_index(-1, -1);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter.init_with_sample_time_index(999, 999);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
| 
 | |
|   // one node
 | |
|   reset_ash_list_with_write_pos(ObActiveSessHistList::get_instance().size());
 | |
|   push_back_sample_time(10);
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(0, 0);
 | |
|   for (int i = 0; i < ObActiveSessHistList::get_instance().size() - 1; i++) {
 | |
|     ASSERT_EQ(true, iter.has_next());
 | |
|     ASSERT_EQ(0, iter.next().sample_time_);
 | |
|   }
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(10, 10);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(9, 10);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(10, 11);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(9, 12);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
| 
 | |
|   // several node
 | |
|   reset_ash_list_with_write_pos(ObActiveSessHistList::get_instance().size());
 | |
|   push_back_sample_time(8);
 | |
|   push_back_sample_time(9);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(11);
 | |
|   push_back_sample_time(12);
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(0, 0);
 | |
|   for (int i = 0; i < ObActiveSessHistList::get_instance().size() - 7; i++) {
 | |
|     ASSERT_EQ(true, iter.has_next());
 | |
|     ASSERT_EQ(0, iter.next().sample_time_);
 | |
|   }
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(10, 10);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(9, 10);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(9, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(10, 11);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(11, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(9, 12);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(12, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(11, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(9, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(7, 9);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(9, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(8, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(999, 996);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter.init_with_sample_time_index(-1, -5);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter.init_with_sample_time_index(-5, -1);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
| 
 | |
|   // timer reverse outcome is false, but should not core.
 | |
|   reset_ash_list_with_write_pos(ObActiveSessHistList::get_instance().size());
 | |
|   push_back_sample_time(8);
 | |
|   push_back_sample_time(9);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(9);
 | |
|   push_back_sample_time(7);
 | |
|   push_back_sample_time(10);
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(0, 0);
 | |
|   ASSERT_EQ(OB_SUCCESS, check_iter_valid(iter));
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(10, 10);
 | |
|   ASSERT_EQ(OB_SUCCESS, check_iter_valid(iter));
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(9, 10);
 | |
|   ASSERT_EQ(OB_SUCCESS, check_iter_valid(iter));
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(10, 11);
 | |
|   ASSERT_EQ(OB_SUCCESS, check_iter_valid(iter));
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(9, 12);
 | |
|   ASSERT_EQ(OB_SUCCESS, check_iter_valid(iter));
 | |
| }
 | |
| 
 | |
| TEST_F(TestAshIndex, ash_overwrite)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
| 
 | |
|   // empty list
 | |
|   auto iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   push_back_sample_time(0);
 | |
|   iter.init_with_sample_time_index(0, 0);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter.init_with_sample_time_index(-1, -1);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter.init_with_sample_time_index(999, 999);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
| 
 | |
|   reset_ash_list();
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   push_back_sample_time(999);
 | |
|   iter.init_with_sample_time_index(0, 0);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter.init_with_sample_time_index(-1, -1);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter.init_with_sample_time_index(999, 999);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
| 
 | |
|   reset_ash_list_with_write_pos(ObActiveSessHistList::get_instance().size());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   push_back_sample_time(0);
 | |
|   iter.init_with_sample_time_index(0, 0);
 | |
|   for (int i = 0; i < ObActiveSessHistList::get_instance().size() - 1; i++) {
 | |
|     ASSERT_EQ(true, iter.has_next()) << "current count:" << i;
 | |
|     ASSERT_EQ(0, iter.next().sample_time_);
 | |
|   }
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   push_back_sample_time(0);
 | |
|   iter.init_with_sample_time_index(0, 0);
 | |
|   push_back_sample_time(0);
 | |
|   for (int i = 0; i < ObActiveSessHistList::get_instance().size() - 2; i++) {
 | |
|     ASSERT_EQ(true, iter.has_next()) << "current count:" << i;
 | |
|     ASSERT_EQ(0, iter.next().sample_time_);
 | |
|   }
 | |
|   ASSERT_EQ(false, iter.has_next()) << "write pos:" << iter.list_->write_pos() << " curr:" << iter.curr_;
 | |
|   iter.init_with_sample_time_index(-1, -1);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter.init_with_sample_time_index(999, 999);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
| 
 | |
|   reset_ash_list_with_write_pos(ObActiveSessHistList::get_instance().size());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   push_back_sample_time(999);
 | |
|   iter.init_with_sample_time_index(0, 0);
 | |
|   for (int i = 0; i < ObActiveSessHistList::get_instance().size() - 1; i++) {
 | |
|     ASSERT_EQ(true, iter.has_next()) << "current count:" << i;
 | |
|     ASSERT_EQ(0, iter.next().sample_time_);
 | |
|   }
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter.init_with_sample_time_index(-1, -1);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
| 
 | |
|   iter.init_with_sample_time_index(999, 999);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(999, 999);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(999, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
| 
 | |
|   // one node
 | |
|   reset_ash_list_with_write_pos(ObActiveSessHistList::get_instance().size());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   push_back_sample_time(10);
 | |
|   iter.init_with_sample_time_index(0, 0);
 | |
|   for (int i = 0; i < ObActiveSessHistList::get_instance().size() - 1; i++) {
 | |
|     ASSERT_EQ(true, iter.has_next()) << "current count:" << i;
 | |
|     ASSERT_EQ(0, iter.next().sample_time_);
 | |
|   }
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   push_back_sample_time(10);
 | |
|   iter.init_with_sample_time_index(10, 10);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   push_back_sample_time(11);
 | |
|   iter.init_with_sample_time_index(9, 11);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   push_back_sample_time(12);
 | |
|   iter.init_with_sample_time_index(10, 11);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(11, iter.next().sample_time_);
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   push_back_sample_time(13);
 | |
|   iter.init_with_sample_time_index(9, 12);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(12, iter.next().sample_time_);
 | |
|   ASSERT_EQ(11, iter.next().sample_time_);
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
| 
 | |
|   // one node, add after binary search
 | |
|   reset_ash_list_with_write_pos(ObActiveSessHistList::get_instance().size());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   push_back_sample_time(10);
 | |
|   iter.init_with_sample_time_index(0, 0);
 | |
|   push_back_sample_time(10);
 | |
|   for (int i = 0; i < ObActiveSessHistList::get_instance().size() - 2; i++) {
 | |
|     ASSERT_EQ(true, iter.has_next());
 | |
|     ASSERT_EQ(0, iter.next().sample_time_);
 | |
|   }
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   push_back_sample_time(10);
 | |
|   iter.init_with_sample_time_index(10, 10);
 | |
|   push_back_sample_time(10);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   push_back_sample_time(11);
 | |
|   iter.init_with_sample_time_index(9, 11);
 | |
|   push_back_sample_time(11);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   push_back_sample_time(12);
 | |
|   iter.init_with_sample_time_index(10, 11);
 | |
|   push_back_sample_time(12);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(11, iter.next().sample_time_);
 | |
|   ASSERT_EQ(11, iter.next().sample_time_);
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   push_back_sample_time(13);
 | |
|   iter.init_with_sample_time_index(9, 12);
 | |
|   push_back_sample_time(13);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(12, iter.next().sample_time_);
 | |
|   ASSERT_EQ(12, iter.next().sample_time_);
 | |
|   ASSERT_EQ(11, iter.next().sample_time_);
 | |
|   ASSERT_EQ(11, iter.next().sample_time_);
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
| 
 | |
|   // several node
 | |
|   reset_ash_list_with_write_pos(ObActiveSessHistList::get_instance().size());
 | |
|   push_back_sample_time(8);
 | |
|   push_back_sample_time(9);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(11);
 | |
|   push_back_sample_time(12);
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   push_back_sample_time(12);
 | |
|   iter.init_with_sample_time_index(0, 0);
 | |
|   push_back_sample_time(12);
 | |
|   for (int i = 0; i < ObActiveSessHistList::get_instance().size() - 9; i++) {
 | |
|     ASSERT_EQ(true, iter.has_next());
 | |
|     ASSERT_EQ(0, iter.next().sample_time_);
 | |
|   }
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   push_back_sample_time(13);
 | |
|   iter.init_with_sample_time_index(12, 13);
 | |
|   push_back_sample_time(13);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(12, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(12, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(12, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   push_back_sample_time(999);
 | |
|   iter.init_with_sample_time_index(996, 999);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter.init_with_sample_time_index(-1, -5);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter.init_with_sample_time_index(-5, -1);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
| 
 | |
|   reset_ash_list_with_write_pos(ObActiveSessHistList::get_instance().size());
 | |
|   push_back_sample_time(8);
 | |
|   push_back_sample_time(9);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(11);
 | |
|   push_back_sample_time(12);
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   ObActiveSessHistList::get_instance().write_pos_ += ObActiveSessHistList::get_instance().size();
 | |
|   iter.init_with_sample_time_index(12, 13);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   ObActiveSessHistList::get_instance().write_pos_ += ObActiveSessHistList::get_instance().size() - 7;
 | |
|   iter.init_with_sample_time_index(12, 13);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(12, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
| 
 | |
|   reset_ash_list_with_write_pos(ObActiveSessHistList::get_instance().size());
 | |
|   push_back_sample_time(8);
 | |
|   push_back_sample_time(9);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(11);
 | |
|   push_back_sample_time(12);
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(0, 8);
 | |
|   for (int i = 0; i < ObActiveSessHistList::get_instance().size() - 8; i++) {
 | |
|     push_back_sample_time(15);
 | |
|   }
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(8, iter.next().sample_time_) << "write pos:" << iter.list_->write_pos() << " curr:" << iter.curr_;;
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(0, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
| }
 | |
| 
 | |
| TEST_F(TestAshIndex, ash_MIN_MAX)
 | |
| {
 | |
|   int ret = OB_SUCCESS;
 | |
| 
 | |
|   // empty list
 | |
|   reset_ash_list();
 | |
|   auto iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(0, INT64_MAX);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(INT64_MAX, 0);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
| 
 | |
|   // one node
 | |
|   reset_ash_list();
 | |
|   push_back_sample_time(10);
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(0, INT64_MAX);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(INT64_MAX, 0);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
| 
 | |
|   // several node
 | |
|   reset_ash_list();
 | |
|   push_back_sample_time(8);
 | |
|   push_back_sample_time(9);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(11);
 | |
|   push_back_sample_time(12);
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(0, INT64_MAX);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(12, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(11, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(9, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(8, iter.next().sample_time_);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(INT64_MAX, 0);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
| 
 | |
|   // timer reverse outcome is false, but should not core.
 | |
|   reset_ash_list();
 | |
|   push_back_sample_time(8);
 | |
|   push_back_sample_time(9);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(9);
 | |
|   push_back_sample_time(7);
 | |
|   push_back_sample_time(10);
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(0, INT_MAX);
 | |
|   ASSERT_EQ(OB_SUCCESS, check_iter_valid(iter));
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(INT64_MAX, 0);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   ASSERT_EQ(OB_SUCCESS, check_iter_valid(iter));
 | |
| 
 | |
|   // empty list
 | |
|   reset_ash_list_with_write_pos(ObActiveSessHistList::get_instance().size());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(0, INT64_MAX);
 | |
|   for (int i = 0; i < ObActiveSessHistList::get_instance().size(); i++) {
 | |
|     ASSERT_EQ(true, iter.has_next());
 | |
|     ASSERT_EQ(0, iter.next().sample_time_);
 | |
|   }
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(INT64_MAX, 0);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
| 
 | |
|   // one node
 | |
|   reset_ash_list_with_write_pos(ObActiveSessHistList::get_instance().size());
 | |
|   push_back_sample_time(10);
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(0, INT64_MAX);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   for (int i = 0; i < ObActiveSessHistList::get_instance().size() - 1; i++) {
 | |
|     ASSERT_EQ(true, iter.has_next());
 | |
|     ASSERT_EQ(0, iter.next().sample_time_);
 | |
|   }
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(INT64_MAX, 0);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
| 
 | |
|   // several node
 | |
|   reset_ash_list_with_write_pos(ObActiveSessHistList::get_instance().size());
 | |
|   push_back_sample_time(8);
 | |
|   push_back_sample_time(9);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(11);
 | |
|   push_back_sample_time(12);
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(0, INT64_MAX);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(12, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(11, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(10, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(9, iter.next().sample_time_);
 | |
|   ASSERT_EQ(true, iter.has_next());
 | |
|   ASSERT_EQ(8, iter.next().sample_time_);
 | |
|   for (int i = 0; i < ObActiveSessHistList::get_instance().size() - 7; i++) {
 | |
|     ASSERT_EQ(true, iter.has_next());
 | |
|     ASSERT_EQ(0, iter.next().sample_time_);
 | |
|   }
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(INT64_MAX, 0);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
| 
 | |
|   // timer reverse outcome is false, but should not core.
 | |
|   reset_ash_list_with_write_pos(ObActiveSessHistList::get_instance().size());
 | |
|   push_back_sample_time(8);
 | |
|   push_back_sample_time(9);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(10);
 | |
|   push_back_sample_time(9);
 | |
|   push_back_sample_time(7);
 | |
|   push_back_sample_time(10);
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(0, INT_MAX);
 | |
|   ASSERT_EQ(OB_SUCCESS, check_iter_valid(iter));
 | |
|   iter = ObActiveSessHistList::get_instance().create_iterator();
 | |
|   iter.init_with_sample_time_index(INT64_MAX, 0);
 | |
|   ASSERT_EQ(false, iter.has_next());
 | |
|   ASSERT_EQ(OB_SUCCESS, check_iter_valid(iter));
 | |
| }
 | |
| 
 | |
| } // end namespace share
 | |
| } // end namespace oceanbase
 | |
| 
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|   oceanbase::common::ObLogger::get_logger().set_log_level("INFO");
 | |
|   OB_LOGGER.set_log_level("INFO");
 | |
|   testing::InitGoogleTest(&argc, argv);
 | |
|   return RUN_ALL_TESTS();
 | |
| }
 |