[memtable_mgr] ObTabletMemtableMgr memtable management
This commit is contained in:
109
src/storage/ob_protected_memtable_mgr_handle.cpp
Normal file
109
src/storage/ob_protected_memtable_mgr_handle.cpp
Normal file
@ -0,0 +1,109 @@
|
||||
/**
|
||||
* 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 "storage/meta_mem/ob_tenant_meta_mem_mgr.h"
|
||||
#include "storage/ob_protected_memtable_mgr_handle.h"
|
||||
|
||||
using namespace oceanbase::share;
|
||||
using namespace oceanbase::memtable;
|
||||
|
||||
namespace oceanbase
|
||||
{
|
||||
namespace storage
|
||||
{
|
||||
|
||||
int ObProtectedMemtableMgrHandle::create_tablet_memtable_mgr_(const ObLSID &ls_id,
|
||||
const ObTabletID &tablet_id,
|
||||
lib::Worker::CompatMode compat_mode)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
ObTabletMemtableMgr *mgr = NULL;
|
||||
ObTabletMemtableMgrPool *pool = MTL(ObTabletMemtableMgrPool*);
|
||||
if (memtable_mgr_handle_.is_valid()) {
|
||||
} else if (OB_ISNULL(mgr = pool->acquire())) {
|
||||
ret = OB_ALLOCATE_MEMORY_FAILED;
|
||||
STORAGE_LOG(WARN, "failed to memtable manager alloc", KR(ret), K(ls_id), K(tablet_id));
|
||||
} else if (OB_FAIL(mgr->ObIMemtableMgr::init(ls_id, tablet_id, compat_mode))) {
|
||||
pool->release(mgr);
|
||||
STORAGE_LOG(WARN, "failed to init memtable mgr", KR(ret), K(tablet_id), K(ls_id));
|
||||
} else {
|
||||
memtable_mgr_handle_.set_memtable_mgr(mgr, pool);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool ObProtectedMemtableMgrHandle::need_reset_()
|
||||
{
|
||||
bool ret = false;
|
||||
SpinRLockGuard guard(memtable_mgr_handle_lock_);
|
||||
ret = need_reset_without_lock_();
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool ObProtectedMemtableMgrHandle::need_reset_without_lock_()
|
||||
{
|
||||
bool ret = false;
|
||||
ObIMemtableMgr *mgr = NULL;
|
||||
if (!memtable_mgr_handle_.is_valid()) {
|
||||
STORAGE_LOG(INFO, "tablet_memtable_handle has been invalid", KR(ret));
|
||||
} else if (FALSE_IT(mgr = memtable_mgr_handle_.get_memtable_mgr())) {
|
||||
} else if (!mgr->has_memtable()) {
|
||||
ret = true;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
// only for non-inner tablet
|
||||
int ObProtectedMemtableMgrHandle::try_reset_memtable_mgr_handle_()
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
SpinWLockGuard guard(memtable_mgr_handle_lock_);
|
||||
if (need_reset_without_lock_()) {
|
||||
STORAGE_LOG(INFO, "memtable_mgr has no memtable, release it", KR(ret), KPC(this));
|
||||
memtable_mgr_handle_.reset();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObProtectedMemtableMgrHandle::reset()
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
SpinWLockGuard guard(memtable_mgr_handle_lock_);
|
||||
if (memtable_mgr_handle_.is_valid()) {
|
||||
ObIMemtableMgr *mgr = memtable_mgr_handle_.get_memtable_mgr();
|
||||
if (OB_FAIL(mgr->has_memtable() && mgr->release_memtables())) {
|
||||
STORAGE_LOG(ERROR, "failed to release memtables", KR(ret), KPC(this));
|
||||
}
|
||||
memtable_mgr_handle_.reset();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObProtectedMemtableMgrHandle::release_memtables_and_try_reset_memtable_mgr_handle(
|
||||
const ObTabletID &tablet_id,
|
||||
const SCN &scn)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
if (scn.is_valid() && OB_FAIL(release_memtables(scn))) {
|
||||
STORAGE_LOG(WARN, "failed to release_memtables", KR(ret), K(tablet_id), K(scn));
|
||||
} else if (!scn.is_valid() && OB_FAIL(release_memtables())) {
|
||||
STORAGE_LOG(WARN, "failed to release_memtables", KR(ret), K(tablet_id));
|
||||
} else if (tablet_id.is_ls_inner_tablet()) {
|
||||
// do nothing
|
||||
} else if (!need_reset_()) {
|
||||
} else if (OB_FAIL(try_reset_memtable_mgr_handle_())) {
|
||||
STORAGE_LOG(WARN, "failed to try_reset_memtable_mgr_handle", KR(ret), K(tablet_id), K(scn), KPC(this));
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
} // namespace storage
|
||||
} // namespace oceanbase
|
||||
Reference in New Issue
Block a user