Files
oceanbase/src/storage/ob_protected_memtable_mgr_handle.cpp

111 lines
3.6 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 "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();
STORAGE_LOG(INFO, "protected_memtable_mgr_handle reset", KR(ret), KPC(this));
}
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