111 lines
3.6 KiB
C++
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
|