fix core at BlockSet::free_block
This commit is contained in:
5
src/share/cache/ob_kv_storecache.cpp
vendored
5
src/share/cache/ob_kv_storecache.cpp
vendored
@ -897,7 +897,6 @@ int ObKVGlobalCache::get_washable_size(const uint64_t tenant_id, int64_t &washab
|
||||
}
|
||||
|
||||
int ObKVGlobalCache::sync_wash_mbs(const uint64_t tenant_id, const int64_t wash_size,
|
||||
const bool wash_single_mb,
|
||||
ObICacheWasher::ObCacheMemBlock *&wash_blocks)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
@ -907,9 +906,9 @@ int ObKVGlobalCache::sync_wash_mbs(const uint64_t tenant_id, const int64_t wash_
|
||||
} else if (OB_INVALID_ID == tenant_id || wash_size <= 0) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
COMMON_LOG(WARN, "invalid arguments", K(ret), K(tenant_id), K(wash_size));
|
||||
} else if (OB_FAIL(store_.sync_wash_mbs(tenant_id, wash_size, wash_single_mb, wash_blocks))) {
|
||||
} else if (OB_FAIL(store_.sync_wash_mbs(tenant_id, wash_size, wash_blocks))) {
|
||||
if (ret != OB_CACHE_FREE_BLOCK_NOT_ENOUGH) {
|
||||
COMMON_LOG(WARN, "sync_wash_mbs failed", K(ret), K(tenant_id), K(wash_size), K(wash_single_mb));
|
||||
COMMON_LOG(WARN, "sync_wash_mbs failed", K(ret), K(tenant_id), K(wash_size));
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
|
||||
1
src/share/cache/ob_kv_storecache.h
vendored
1
src/share/cache/ob_kv_storecache.h
vendored
@ -158,7 +158,6 @@ public:
|
||||
|
||||
// wash memblock from cache synchronously
|
||||
virtual int sync_wash_mbs(const uint64_t tenant_id, const int64_t wash_size,
|
||||
const bool wash_single_mb,
|
||||
lib::ObICacheWasher::ObCacheMemBlock *&wash_blocks);
|
||||
int set_storage_leak_check_mod(const char *check_mod);
|
||||
int get_cache_name(const int64_t cache_id, char *cache_name);
|
||||
|
||||
16
src/share/cache/ob_kvcache_store.cpp
vendored
16
src/share/cache/ob_kvcache_store.cpp
vendored
@ -496,7 +496,6 @@ void ObKVCacheStore::flush_washable_mbs(const uint64_t tenant_id, const int64_t
|
||||
}
|
||||
|
||||
int ObKVCacheStore::sync_wash_mbs(const uint64_t tenant_id, const int64_t size_need_washed,
|
||||
const bool wash_single_mb,
|
||||
ObICacheWasher::ObCacheMemBlock *&wash_blocks)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
@ -504,11 +503,10 @@ int ObKVCacheStore::sync_wash_mbs(const uint64_t tenant_id, const int64_t size_n
|
||||
if (!inited_) {
|
||||
ret = OB_NOT_INIT;
|
||||
COMMON_LOG(WARN, "not init", K(ret));
|
||||
} else if (OB_INVALID_ID == tenant_id || size_need_washed <= 0
|
||||
|| (wash_single_mb && size_need_washed != aligned_block_size_)) {
|
||||
} else if (OB_INVALID_ID == tenant_id || size_need_washed <= 0) {
|
||||
ret = OB_INVALID_ARGUMENT;
|
||||
COMMON_LOG(WARN, "invalid arguments", K(ret), K(tenant_id), K(size_need_washed),
|
||||
K(wash_single_mb), K_(aligned_block_size));
|
||||
K_(aligned_block_size));
|
||||
} else if (OB_FAIL(try_flush_washable_mb(tenant_id, wash_blocks, -1, size_need_washed))) {
|
||||
if (ret != OB_CACHE_FREE_BLOCK_NOT_ENOUGH) {
|
||||
COMMON_LOG(WARN, "Fail to try flush mb", K(ret), K(tenant_id));
|
||||
@ -1313,26 +1311,24 @@ void *ObKVCacheStore::alloc_mb(ObTenantResourceMgrHandle &resource_handle,
|
||||
} else if (NULL == (ptr = resource_handle.get_memory_mgr()->alloc_cache_mb(block_size))) {
|
||||
if (block_size == block_size_) {
|
||||
ObICacheWasher::ObCacheMemBlock *washed_blocks = NULL;
|
||||
const bool wash_single_mb = true;
|
||||
const int64_t wash_size = aligned_block_size_;
|
||||
if (OB_FAIL(sync_wash_mbs(tenant_id, wash_size, wash_single_mb, washed_blocks))) {
|
||||
if (OB_FAIL(sync_wash_mbs(tenant_id, wash_size, washed_blocks))) {
|
||||
COMMON_LOG(WARN, "sync_wash_mbs failed", K(ret),
|
||||
K(tenant_id), K(wash_size), K(wash_single_mb));
|
||||
K(tenant_id), K(wash_size));
|
||||
} else {
|
||||
ptr = reinterpret_cast<void *>(washed_blocks);
|
||||
}
|
||||
} else {
|
||||
const int64_t max_retry_count = 3;
|
||||
int64_t retry_count = 0;
|
||||
const bool wash_single_mb = false;
|
||||
while (OB_SUCC(ret) && NULL == ptr && retry_count < max_retry_count) {
|
||||
ObICacheWasher::ObCacheMemBlock *washed_blocks = NULL;
|
||||
int64_t wash_size = ObTenantMemoryMgr::align(block_size);
|
||||
if (wash_size > aligned_block_size_) {
|
||||
wash_size += 2 * aligned_block_size_;
|
||||
}
|
||||
if (OB_FAIL(sync_wash_mbs(tenant_id, wash_size, wash_single_mb, washed_blocks))) {
|
||||
COMMON_LOG(WARN, "sync_wash_mbs failed", K(ret), K(tenant_id), K(wash_size), K(wash_single_mb));
|
||||
if (OB_FAIL(sync_wash_mbs(tenant_id, wash_size, washed_blocks))) {
|
||||
COMMON_LOG(WARN, "sync_wash_mbs failed", K(ret), K(tenant_id), K(wash_size));
|
||||
} else {
|
||||
ObICacheWasher::ObCacheMemBlock *wash_block = washed_blocks;
|
||||
ObICacheWasher::ObCacheMemBlock *next = NULL;
|
||||
|
||||
1
src/share/cache/ob_kvcache_store.h
vendored
1
src/share/cache/ob_kvcache_store.h
vendored
@ -85,7 +85,6 @@ public:
|
||||
void flush_washable_mbs(const uint64_t tenant_id, const int64_t cache_id);
|
||||
|
||||
int sync_wash_mbs(const uint64_t tenant_id, const int64_t wash_size,
|
||||
const bool wash_single_mb,
|
||||
lib::ObICacheWasher::ObCacheMemBlock *&wash_blocks);
|
||||
|
||||
virtual int alloc_mbhandle(ObKVCacheInst &inst, const int64_t block_size,
|
||||
|
||||
Reference in New Issue
Block a user