394 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			394 lines
		
	
	
		
			13 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 <gtest/gtest.h>
 | |
| #include "ob_log_utils.h"       // current_time
 | |
| #include "ob_small_arena.h"
 | |
| 
 | |
| #include "lib/allocator/ob_concurrent_fifo_allocator.h"   // ObConcurrentFIFOAllocator
 | |
| 
 | |
| #define ALLOC_AND_CHECK(size) ALLOC_ALIGN_AND_CHECK(sizeof(void*), size)
 | |
| 
 | |
| #define ALLOC_ALIGN_AND_CHECK(align_size, size) \
 | |
|     do { \
 | |
|       int64_t alloc_size = (size); \
 | |
|       int64_t align = (align_size); \
 | |
|       int64_t max_small_size = MAX_SMALL_ALLOC_SIZE(align); \
 | |
|       void *ptr = sa.alloc_aligned(alloc_size, align); \
 | |
| \
 | |
|       ASSERT_TRUE(NULL != ptr); \
 | |
|       EXPECT_EQ(0, reinterpret_cast<int64_t>(ptr) & (align - 1)); \
 | |
| \
 | |
|       if (alloc_size > max_small_size) { \
 | |
|         large_alloc_count++; \
 | |
|       } else { \
 | |
|         small_alloc_count++; \
 | |
|       } \
 | |
| \
 | |
|       EXPECT_EQ(small_alloc_count, sa.get_small_alloc_count()); \
 | |
|       EXPECT_EQ(large_alloc_count, sa.get_large_alloc_count()); \
 | |
| \
 | |
|       ((char *)ptr)[alloc_size - 1] = 'a'; \
 | |
|     } while (0)
 | |
| 
 | |
| #define MAX_SMALL_ALLOC_SIZE(align) (MAX_SMALL_ALLOC_SIZE_WITHOUT_ALIGN - align + 1)
 | |
| 
 | |
| namespace oceanbase
 | |
| {
 | |
| namespace libobcdc
 | |
| {
 | |
| 
 | |
| static const int64_t SMALL_ARENA_PAGE_SIZE = 1024;
 | |
| static const int64_t MAX_SMALL_ALLOC_SIZE_WITHOUT_ALIGN = SMALL_ARENA_PAGE_SIZE - ObSmallArena::SMALL_PAGE_HEADER_SIZE;
 | |
| static const int64_t PAGE_SIZE = 1024;
 | |
| 
 | |
| using namespace common;
 | |
| 
 | |
| // TODO: add multi thread test
 | |
| class TestSmallArena : public ::testing::Test
 | |
| {
 | |
| public:
 | |
|   TestSmallArena() {}
 | |
|   ~TestSmallArena() {}
 | |
| 
 | |
|   virtual void SetUp();
 | |
|   virtual void TearDown();
 | |
| 
 | |
| public:
 | |
|   ObConcurrentFIFOAllocator large_allocator_;
 | |
|   static const uint64_t tenant_id_ = 0;
 | |
| };
 | |
| 
 | |
| void TestSmallArena::SetUp()
 | |
| {
 | |
|   const static int64_t LARGE_PAGE_SIZE = (1LL << 26);
 | |
|   const static int64_t LARGE_TOTAL_LIMIT = (1LL << 34);
 | |
|   const static int64_t LARGE_HOLD_LIMIT = LARGE_PAGE_SIZE;
 | |
|   ASSERT_EQ(OB_SUCCESS, large_allocator_.init(LARGE_TOTAL_LIMIT, LARGE_HOLD_LIMIT, LARGE_PAGE_SIZE));
 | |
| 
 | |
|   srandom((unsigned int)get_timestamp());
 | |
| }
 | |
| 
 | |
| void TestSmallArena::TearDown()
 | |
| {
 | |
|   large_allocator_.destroy();
 | |
| }
 | |
| 
 | |
| TEST_F(TestSmallArena, smoke_test)
 | |
| {
 | |
|   ObSmallArena sa;
 | |
|   int64_t small_alloc_count = 0;
 | |
|   int64_t large_alloc_count = 0;
 | |
| 
 | |
|   sa.set_allocator(PAGE_SIZE, large_allocator_);
 | |
| 
 | |
|   ALLOC_AND_CHECK(8);
 | |
|   ALLOC_AND_CHECK(16);
 | |
|   ALLOC_AND_CHECK(256);
 | |
|   ALLOC_AND_CHECK(512);
 | |
|   ALLOC_AND_CHECK(17 + 8);
 | |
|   ALLOC_AND_CHECK(17 + 16);
 | |
|   ALLOC_AND_CHECK(17 + 256);
 | |
|   ALLOC_AND_CHECK(17 + 512);
 | |
|   ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE + 8);
 | |
|   ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE + 16);
 | |
|   ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE + 256);
 | |
|   ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE + 512);
 | |
|   ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE + 17 + 8);
 | |
|   ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE + 17 + 16);
 | |
|   ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE + 17 + 256);
 | |
|   ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE + 17 + 512);
 | |
|   ALLOC_AND_CHECK((1<<21) + SMALL_ARENA_PAGE_SIZE + 8);
 | |
|   ALLOC_AND_CHECK((1<<21) + SMALL_ARENA_PAGE_SIZE + 16);
 | |
|   ALLOC_AND_CHECK((1<<21) + SMALL_ARENA_PAGE_SIZE + 256);
 | |
|   ALLOC_AND_CHECK((1<<21) + SMALL_ARENA_PAGE_SIZE + 512);
 | |
|   ALLOC_AND_CHECK((1<<21) + SMALL_ARENA_PAGE_SIZE + 17 + 8);
 | |
|   ALLOC_AND_CHECK((1<<21) + SMALL_ARENA_PAGE_SIZE + 17 + 16);
 | |
|   ALLOC_AND_CHECK((1<<21) + SMALL_ARENA_PAGE_SIZE + 17 + 256);
 | |
|   ALLOC_AND_CHECK((1<<21) + SMALL_ARENA_PAGE_SIZE + 17 + 512);
 | |
| 
 | |
|   sa.reset();
 | |
|   small_alloc_count = 0;
 | |
|   large_alloc_count = 0;
 | |
| 
 | |
|   ALLOC_AND_CHECK(8);
 | |
|   ALLOC_AND_CHECK(16);
 | |
|   ALLOC_AND_CHECK(256);
 | |
|   ALLOC_AND_CHECK(512);
 | |
|   ALLOC_AND_CHECK(17 + 8);
 | |
|   ALLOC_AND_CHECK(17 + 16);
 | |
|   ALLOC_AND_CHECK(17 + 256);
 | |
|   ALLOC_AND_CHECK(17 + 512);
 | |
|   ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE + 8);
 | |
|   ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE + 16);
 | |
|   ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE + 256);
 | |
|   ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE + 512);
 | |
|   ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE + 17 + 8);
 | |
|   ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE + 17 + 16);
 | |
|   ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE + 17 + 256);
 | |
|   ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE + 17 + 512);
 | |
|   ALLOC_AND_CHECK((1<<21) + SMALL_ARENA_PAGE_SIZE + 8);
 | |
|   ALLOC_AND_CHECK((1<<21) + SMALL_ARENA_PAGE_SIZE + 16);
 | |
|   ALLOC_AND_CHECK((1<<21) + SMALL_ARENA_PAGE_SIZE + 256);
 | |
|   ALLOC_AND_CHECK((1<<21) + SMALL_ARENA_PAGE_SIZE + 512);
 | |
|   ALLOC_AND_CHECK((1<<21) + SMALL_ARENA_PAGE_SIZE + 17 + 8);
 | |
|   ALLOC_AND_CHECK((1<<21) + SMALL_ARENA_PAGE_SIZE + 17 + 16);
 | |
|   ALLOC_AND_CHECK((1<<21) + SMALL_ARENA_PAGE_SIZE + 17 + 256);
 | |
|   ALLOC_AND_CHECK((1<<21) + SMALL_ARENA_PAGE_SIZE + 17 + 512);
 | |
| 
 | |
|   sa.reset();
 | |
|   small_alloc_count = 0;
 | |
|   large_alloc_count = 0;
 | |
| }
 | |
| 
 | |
| TEST_F(TestSmallArena, alloc_small)
 | |
| {
 | |
|   static const int64_t TEST_COUNT = 10;
 | |
|   int64_t max_alloc_size = MAX_SMALL_ALLOC_SIZE(8);
 | |
|   int64_t small_alloc_count = 0;
 | |
|   int64_t large_alloc_count = 0;
 | |
|   ObSmallArena sa;
 | |
| 
 | |
|   sa.set_allocator(PAGE_SIZE, large_allocator_);
 | |
| 
 | |
|   for (int i = 0; i < TEST_COUNT; i++) {
 | |
|     ALLOC_AND_CHECK(8);
 | |
|     ALLOC_AND_CHECK(16);
 | |
|     ALLOC_AND_CHECK(256);
 | |
|     ALLOC_AND_CHECK(512);
 | |
|     ALLOC_AND_CHECK(17 + 8);
 | |
|     ALLOC_AND_CHECK(17 + 16);
 | |
|     ALLOC_AND_CHECK(17 + 256);
 | |
|     ALLOC_AND_CHECK(17 + 512);
 | |
|     ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE - 15);
 | |
|     ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE - 16);
 | |
|     ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE - 17);
 | |
|     ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE - 64);
 | |
|     ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE - 67);
 | |
|     ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE - 128);
 | |
|     ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE - 129);
 | |
| 
 | |
|     ALLOC_AND_CHECK(random() % (max_alloc_size + 1));
 | |
|   }
 | |
| 
 | |
|   sa.reset();
 | |
|   small_alloc_count = 0;
 | |
|   large_alloc_count = 0;
 | |
| 
 | |
|   for (int i = 0; i < TEST_COUNT; i++) {
 | |
|     ALLOC_AND_CHECK(8);
 | |
|     ALLOC_AND_CHECK(16);
 | |
|     ALLOC_AND_CHECK(256);
 | |
|     ALLOC_AND_CHECK(512);
 | |
|     ALLOC_AND_CHECK(17 + 8);
 | |
|     ALLOC_AND_CHECK(17 + 16);
 | |
|     ALLOC_AND_CHECK(17 + 256);
 | |
|     ALLOC_AND_CHECK(17 + 512);
 | |
|     ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE - 15);
 | |
|     ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE - 16);
 | |
|     ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE - 17);
 | |
|     ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE - 64);
 | |
|     ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE - 67);
 | |
|     ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE - 128);
 | |
|     ALLOC_AND_CHECK(SMALL_ARENA_PAGE_SIZE - 129);
 | |
| 
 | |
|     ALLOC_AND_CHECK(random() % (max_alloc_size + 1));
 | |
|   }
 | |
| 
 | |
|   sa.reset();
 | |
|   small_alloc_count = 0;
 | |
|   large_alloc_count = 0;
 | |
| }
 | |
| 
 | |
| TEST_F(TestSmallArena, alloc_large)
 | |
| {
 | |
|   static const int64_t TEST_COUNT = 10;
 | |
|   int64_t max_alloc_size = (1 << 22);
 | |
|   int64_t min_alloc_size = MAX_SMALL_ALLOC_SIZE(8) + 1;
 | |
|   int64_t small_alloc_count = 0;
 | |
|   int64_t large_alloc_count = 0;
 | |
|   ObSmallArena sa;
 | |
| 
 | |
|   sa.set_allocator(PAGE_SIZE, large_allocator_);
 | |
| 
 | |
|   for (int i = 0; i < TEST_COUNT; i++) {
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 0);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 1);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 2);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 4);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 8);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 16);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 256);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 512);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 17 + 8);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 17 + 16);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 17 + 256);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 17 + 512);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 1 * SMALL_ARENA_PAGE_SIZE);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 2 * SMALL_ARENA_PAGE_SIZE);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 3 * SMALL_ARENA_PAGE_SIZE);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 4 * SMALL_ARENA_PAGE_SIZE);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 5 * SMALL_ARENA_PAGE_SIZE);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 6 * SMALL_ARENA_PAGE_SIZE);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 7 * SMALL_ARENA_PAGE_SIZE);
 | |
|     ALLOC_AND_CHECK((1LL << 10) + 11);
 | |
|     ALLOC_AND_CHECK((1LL << 12) + 13);
 | |
|     ALLOC_AND_CHECK((1LL << 18) + 17);
 | |
|     ALLOC_AND_CHECK((1LL << 19) + 19);
 | |
|     ALLOC_AND_CHECK((1LL << 20) + 7);
 | |
|     ALLOC_AND_CHECK((1LL << 21) + 3);
 | |
| 
 | |
|     ALLOC_AND_CHECK((random() % (max_alloc_size)) + min_alloc_size);
 | |
|   }
 | |
| 
 | |
|   sa.reset();
 | |
|   small_alloc_count = 0;
 | |
|   large_alloc_count = 0;
 | |
| 
 | |
|   for (int i = 0; i < TEST_COUNT; i++) {
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 0);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 1);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 2);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 4);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 8);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 16);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 256);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 512);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 17 + 8);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 17 + 16);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 17 + 256);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 17 + 512);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 1 * SMALL_ARENA_PAGE_SIZE);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 2 * SMALL_ARENA_PAGE_SIZE);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 3 * SMALL_ARENA_PAGE_SIZE);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 4 * SMALL_ARENA_PAGE_SIZE);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 5 * SMALL_ARENA_PAGE_SIZE);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 6 * SMALL_ARENA_PAGE_SIZE);
 | |
|     ALLOC_AND_CHECK(min_alloc_size + 7 * SMALL_ARENA_PAGE_SIZE);
 | |
|     ALLOC_AND_CHECK((1LL << 10) + 11);
 | |
|     ALLOC_AND_CHECK((1LL << 12) + 13);
 | |
|     ALLOC_AND_CHECK((1LL << 18) + 17);
 | |
|     ALLOC_AND_CHECK((1LL << 19) + 19);
 | |
|     ALLOC_AND_CHECK((1LL << 20) + 7);
 | |
|     ALLOC_AND_CHECK((1LL << 21) + 3);
 | |
| 
 | |
|     ALLOC_AND_CHECK((random() % (max_alloc_size)) + min_alloc_size);
 | |
|   }
 | |
| 
 | |
|   sa.reset();
 | |
|   small_alloc_count = 0;
 | |
|   large_alloc_count = 0;
 | |
| }
 | |
| 
 | |
| TEST_F(TestSmallArena, alloc_align)
 | |
| {
 | |
|   int64_t small_alloc_count = 0;
 | |
|   int64_t large_alloc_count = 0;
 | |
|   ObSmallArena sa;
 | |
| 
 | |
|   sa.set_allocator(PAGE_SIZE, large_allocator_);
 | |
| 
 | |
|   ALLOC_ALIGN_AND_CHECK(1, 4);
 | |
|   ALLOC_ALIGN_AND_CHECK(16, 8);
 | |
|   ALLOC_ALIGN_AND_CHECK(32, 16);
 | |
|   ALLOC_ALIGN_AND_CHECK(64, 256);
 | |
|   ALLOC_ALIGN_AND_CHECK(128, 512);
 | |
|   ALLOC_ALIGN_AND_CHECK(16, 17 + 8);
 | |
|   ALLOC_ALIGN_AND_CHECK(32, 17 + 16);
 | |
|   ALLOC_ALIGN_AND_CHECK(64, 17 + 256);
 | |
|   ALLOC_ALIGN_AND_CHECK(128, 17 + 512);
 | |
|   ALLOC_ALIGN_AND_CHECK(16, SMALL_ARENA_PAGE_SIZE + 8);
 | |
|   ALLOC_ALIGN_AND_CHECK(32, SMALL_ARENA_PAGE_SIZE + 16);
 | |
|   ALLOC_ALIGN_AND_CHECK(64, SMALL_ARENA_PAGE_SIZE + 256);
 | |
|   ALLOC_ALIGN_AND_CHECK(128, SMALL_ARENA_PAGE_SIZE + 512);
 | |
|   ALLOC_ALIGN_AND_CHECK(16, SMALL_ARENA_PAGE_SIZE + 17 + 8);
 | |
|   ALLOC_ALIGN_AND_CHECK(32, SMALL_ARENA_PAGE_SIZE + 17 + 16);
 | |
|   ALLOC_ALIGN_AND_CHECK(64, SMALL_ARENA_PAGE_SIZE + 17 + 256);
 | |
|   ALLOC_ALIGN_AND_CHECK(128, SMALL_ARENA_PAGE_SIZE + 17 + 512);
 | |
|   ALLOC_ALIGN_AND_CHECK(16, (1LL<<21) + SMALL_ARENA_PAGE_SIZE + 8);
 | |
|   ALLOC_ALIGN_AND_CHECK(32, (1LL<<21) + SMALL_ARENA_PAGE_SIZE + 16);
 | |
|   ALLOC_ALIGN_AND_CHECK(64, (1LL<<21) + SMALL_ARENA_PAGE_SIZE + 256);
 | |
|   ALLOC_ALIGN_AND_CHECK(128, (1LL<<21) + SMALL_ARENA_PAGE_SIZE + 512);
 | |
|   ALLOC_ALIGN_AND_CHECK(16, (1LL<<21) + SMALL_ARENA_PAGE_SIZE + 17 + 8);
 | |
|   ALLOC_ALIGN_AND_CHECK(32, (1LL<<21) + SMALL_ARENA_PAGE_SIZE + 17 + 16);
 | |
|   ALLOC_ALIGN_AND_CHECK(64, (1LL<<21) + SMALL_ARENA_PAGE_SIZE + 17 + 256);
 | |
|   ALLOC_ALIGN_AND_CHECK(128, (1LL<<21) + SMALL_ARENA_PAGE_SIZE + 17 + 512);
 | |
| 
 | |
|   sa.reset();
 | |
|   small_alloc_count = 0;
 | |
|   large_alloc_count = 0;
 | |
| 
 | |
|   ALLOC_ALIGN_AND_CHECK(1, 4);
 | |
|   ALLOC_ALIGN_AND_CHECK(16, 8);
 | |
|   ALLOC_ALIGN_AND_CHECK(32, 16);
 | |
|   ALLOC_ALIGN_AND_CHECK(64, 256);
 | |
|   ALLOC_ALIGN_AND_CHECK(128, 512);
 | |
|   ALLOC_ALIGN_AND_CHECK(16, 17 + 8);
 | |
|   ALLOC_ALIGN_AND_CHECK(32, 17 + 16);
 | |
|   ALLOC_ALIGN_AND_CHECK(64, 17 + 256);
 | |
|   ALLOC_ALIGN_AND_CHECK(128, 17 + 512);
 | |
|   ALLOC_ALIGN_AND_CHECK(16, SMALL_ARENA_PAGE_SIZE + 8);
 | |
|   ALLOC_ALIGN_AND_CHECK(32, SMALL_ARENA_PAGE_SIZE + 16);
 | |
|   ALLOC_ALIGN_AND_CHECK(64, SMALL_ARENA_PAGE_SIZE + 256);
 | |
|   ALLOC_ALIGN_AND_CHECK(128, SMALL_ARENA_PAGE_SIZE + 512);
 | |
|   ALLOC_ALIGN_AND_CHECK(16, SMALL_ARENA_PAGE_SIZE + 17 + 8);
 | |
|   ALLOC_ALIGN_AND_CHECK(32, SMALL_ARENA_PAGE_SIZE + 17 + 16);
 | |
|   ALLOC_ALIGN_AND_CHECK(64, SMALL_ARENA_PAGE_SIZE + 17 + 256);
 | |
|   ALLOC_ALIGN_AND_CHECK(128, SMALL_ARENA_PAGE_SIZE + 17 + 512);
 | |
|   ALLOC_ALIGN_AND_CHECK(16, (1LL<<21) + SMALL_ARENA_PAGE_SIZE + 8);
 | |
|   ALLOC_ALIGN_AND_CHECK(32, (1LL<<21) + SMALL_ARENA_PAGE_SIZE + 16);
 | |
|   ALLOC_ALIGN_AND_CHECK(64, (1LL<<21) + SMALL_ARENA_PAGE_SIZE + 256);
 | |
|   ALLOC_ALIGN_AND_CHECK(128, (1LL<<21) + SMALL_ARENA_PAGE_SIZE + 512);
 | |
|   ALLOC_ALIGN_AND_CHECK(16, (1LL<<21) + SMALL_ARENA_PAGE_SIZE + 17 + 8);
 | |
|   ALLOC_ALIGN_AND_CHECK(32, (1LL<<21) + SMALL_ARENA_PAGE_SIZE + 17 + 16);
 | |
|   ALLOC_ALIGN_AND_CHECK(64, (1LL<<21) + SMALL_ARENA_PAGE_SIZE + 17 + 256);
 | |
|   ALLOC_ALIGN_AND_CHECK(128, (1LL<<21) + SMALL_ARENA_PAGE_SIZE + 17 + 512);
 | |
| 
 | |
|   sa.reset();
 | |
|   small_alloc_count = 0;
 | |
|   large_alloc_count = 0;
 | |
| }
 | |
| 
 | |
| TEST_F(TestSmallArena, init_err)
 | |
| {
 | |
|   void *ptr = NULL;
 | |
|   ObSmallArena sa;
 | |
|   ptr = sa.alloc(8); EXPECT_TRUE(NULL == ptr);
 | |
| 
 | |
|   sa.set_allocator(-1, large_allocator_);
 | |
|   ptr = sa.alloc(8); EXPECT_TRUE(NULL == ptr);
 | |
| 
 | |
|   sa.reset();
 | |
| }
 | |
| 
 | |
| TEST_F(TestSmallArena, invalid_args)
 | |
| {
 | |
|   void *ptr = NULL;
 | |
|   ObSmallArena sa;
 | |
|   sa.set_allocator(PAGE_SIZE, large_allocator_);
 | |
|   ptr = sa.alloc(-1); EXPECT_TRUE(NULL == ptr);
 | |
|   ptr = sa.alloc_aligned(1,3); EXPECT_TRUE(NULL == ptr);
 | |
|   ptr = sa.alloc_aligned(1, 1024); EXPECT_TRUE(NULL == ptr);
 | |
|   sa.reset();
 | |
| }
 | |
| 
 | |
| } // namespace libobcdc
 | |
| } // ns oceanbase
 | |
| 
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|   oceanbase::common::ObLogger::get_logger().set_log_level("DEBUG");
 | |
|   OB_LOGGER.set_log_level("DEBUG");
 | |
|   testing::InitGoogleTest(&argc, argv);
 | |
|   return RUN_ALL_TESTS();
 | |
| }
 | 
