fix core at BlockSet::free_block

This commit is contained in:
tushicheng
2024-03-11 08:45:35 +00:00
committed by ob-robot
parent ff29d48d7c
commit 91295b58cc
7 changed files with 58 additions and 120 deletions

View File

@ -148,42 +148,27 @@ public:
return ret;
}
int sync_wash_mbs(const uint64_t tenant_id, const int64_t wash_size,
bool wash_single_mb, ObCacheMemBlock *&wash_blocks)
ObCacheMemBlock *&wash_blocks)
{
UNUSED(tenant_id);
int ret = OB_SUCCESS;
if (wash_single_mb) {
if (wash_size > CHUNK_MGR.aligned(mb_size_)) {
int64_t left_to_washed = wash_size;
ObCacheMemBlock *washed_blocks = NULL;
while (OB_SUCC(ret) && left_to_washed > 0) {
if (NULL == mb_blocks_) {
ret = OB_CACHE_FREE_BLOCK_NOT_ENOUGH;
LIB_LOG(WARN, "wash_size > mb_size", K(ret), K(wash_size), K_(mb_size));
} else if (NULL == mb_blocks_) {
ret = OB_CACHE_FREE_BLOCK_NOT_ENOUGH;
LIB_LOG(WARN, "free block not enough", K(ret), K(wash_size), K_(mb_size));
LIB_LOG(WARN, "free block not enough", K(ret), K(wash_size));
} else {
ObCacheMemBlock *free_block = mb_blocks_;
mb_blocks_ = free_block->next_;
free_block->next_ = NULL;
wash_blocks = free_block;
}
} else {
int64_t left_to_washed = wash_size;
ObCacheMemBlock *washed_blocks = NULL;
while (OB_SUCC(ret) && left_to_washed > 0) {
if (NULL == mb_blocks_) {
ret = OB_CACHE_FREE_BLOCK_NOT_ENOUGH;
LIB_LOG(WARN, "free block not enough", K(ret), K(wash_size));
} else {
ObCacheMemBlock *free_block = mb_blocks_;
mb_blocks_ = free_block->next_;
free_block->next_ = washed_blocks;
washed_blocks = free_block;
left_to_washed -= CHUNK_MGR.aligned(mb_size_);
}
}
if (OB_SUCC(ret)) {
wash_blocks = washed_blocks;
free_block->next_ = washed_blocks;
washed_blocks = free_block;
left_to_washed -= CHUNK_MGR.aligned(mb_size_);
}
}
if (OB_SUCC(ret)) {
wash_blocks = washed_blocks;
}
return ret;
}
void free_mbs(ObTenantMemoryMgr &mgr)
@ -239,18 +224,18 @@ TEST(TestTenantMemoryMgr, sync_wash)
++alloc_count;
}
}
// check stat, left one mb in cache
ASSERT_EQ(aligned_size, memory_mgr.get_cache_hold());
ASSERT_EQ(1, memory_mgr.get_cache_item_count());
ASSERT_EQ(aligned_size * mb_count, memory_mgr.get_sum_hold());
ASSERT_EQ(mb_count - 1, alloc_count);
mb_count -= alloc_count;
ASSERT_EQ(aligned_size * mb_count, memory_mgr.get_cache_hold());
ASSERT_EQ(mb_count, memory_mgr.get_cache_item_count());
ASSERT_EQ(aligned_size * (mb_count + alloc_count), memory_mgr.get_sum_hold());
for (int64_t i = 0; i < chunks.count(); ++i) {
memory_mgr.free_chunk((AChunk *)chunks.at(i), attr);
}
washer.free_mbs(memory_mgr);
for (int64_t i = 0; i < mb_count; ++i) {
washer.free_mbs(memory_mgr);
}
ASSERT_EQ(0, memory_mgr.get_cache_hold());
ASSERT_EQ(0, memory_mgr.get_cache_item_count());
ASSERT_EQ(0, memory_mgr.get_ctx_hold_bytes()[0]);