Files
oceanbase/unittest/sql/plan_cache/test_plan_cache_manager.cpp
wangzelin.wzl 93a1074b0c patch 4.0
2022-10-24 17:57:12 +08:00

127 lines
3.3 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.
*/
#define USING_LOG_PREFIX SQL
#include <unistd.h>
#include "lib/json/ob_json.h"
#include "test_sql.h"
#include "lib/allocator/ob_malloc.h"
using namespace oceanbase::common;
using namespace oceanbase::json;
using namespace oceanbase::share::schema;
namespace test
{
static int MAX_THREAD_COUNT = 1;
static uint64_t TENANT_ID_NUM = 1;
static TestSQL *test_sql = NULL;
static ObPlanCacheManager *plan_cache_mgr = NULL;
void init_pcm()
{
if (NULL == test_sql) {
test_sql = new TestSQL(ObString("test_schema.sql"));
ASSERT_TRUE(test_sql);
test_sql->init();
}
if (NULL == plan_cache_mgr) {
plan_cache_mgr = new ObPlanCacheManager;
plan_cache_mgr->init(test_sql->get_part_cache(), test_sql->get_addr());
}
}
class TestPlanCacheManager : public ::testing::Test
{
public:
TestPlanCacheManager() {}
virtual ~TestPlanCacheManager() {}
void SetUp() {}
void TearDown() {}
private:
// disallow copy
TestPlanCacheManager(const TestPlanCacheManager &other);
TestPlanCacheManager& operator=(const TestPlanCacheManager &other);
};
void test_plan_cache_manager()
{
uint64_t tenant_id = 0;
ObPlanCache *plan_cache = NULL;
//test get_plan_cache()
ObPCMemPctConf conf;
for (tenant_id = 0; tenant_id < TENANT_ID_NUM; tenant_id++) {
plan_cache = plan_cache_mgr->get_plan_cache(tenant_id);
plan_cache = plan_cache_mgr->get_or_create_plan_cache(tenant_id, conf);//may be plan_cache = NULL in parallel
LOG_INFO("get_plan_cache",K(tenant_id), K(plan_cache));
//ob_print_mod_memory_usage();
if (TENANT_ID_NUM/2 == tenant_id) {
plan_cache_mgr->elimination_task_.runTimerTask();
}
}
//test revert_plan_cache()
EXPECT_TRUE(OB_SUCCESS == plan_cache_mgr->revert_plan_cache(TENANT_ID_NUM - 1));
EXPECT_TRUE(OB_SUCCESS == plan_cache_mgr->revert_plan_cache(TENANT_ID_NUM + 1));
}
class ObPlanCacheManagerRunnable : public share::ObThreadPool
{
public:
void run1()
{
test_plan_cache_manager();
}
};
TEST_F(TestPlanCacheManager, basic)
{
// test
ObPlanCacheManagerRunnable pcm_runner;
for (int i = 0; i < MAX_THREAD_COUNT; ++i) {
pcm_runner.start();
}
for (int i = 0; i < MAX_THREAD_COUNT; ++i) {
pcm_runner.wait();
}
EXPECT_TRUE(OB_SUCCESS == plan_cache_mgr->flush_all_plan_cache());
plan_cache_mgr->destroy(); }
}//namespace test end
int main(int argc, char **argv)
{
::oceanbase::sql::init_sql_factories();
::testing::InitGoogleTest(&argc,argv);
int c = 0;
while(-1 != (c = getopt(argc, argv, "t::n::"))) {
switch (c) {
case 't':
if (NULL != optarg) {
test::MAX_THREAD_COUNT = atoi(optarg);
}
break;
case 'n':
if (NULL != optarg) {
test::TENANT_ID_NUM = atoi(optarg);
}
default:
break;
}
}
::test::init_pcm();
return RUN_ALL_TESTS();
}//namespace test end