oceanbase/unittest/share/test_ash_index.cpp
AntiTopQuark e0b1dda713 [FEAT MERGE] Phase one of 3A project
Co-authored-by: rolandqi <qikai456@126.com>
Co-authored-by: yangzhifeng <yangzhifeng83@gmail.com>
2023-08-25 08:44:14 +00:00

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();
}