fix core at BlockSet::free_block
This commit is contained in:
@ -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]);
|
||||
|
||||
Reference in New Issue
Block a user