130 lines
3.3 KiB
C++
130 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
|
|
|
|
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
|