Release memtables in remove_tablet

This commit is contained in:
obdev 2023-04-20 07:11:34 +00:00 committed by ob-robot
parent 517bc412b9
commit 75e30dfb3e
6 changed files with 30 additions and 51 deletions

View File

@ -554,8 +554,8 @@ int ObLSTabletService::remove_tablets(const common::ObIArray<common::ObTabletID>
} else {
LOG_WARN("failed to get tablet", K(ret), K(key));
}
} else if (OB_FAIL(tablet_handle.get_obj()->remove_memtables_from_data_checkpoint())) {
LOG_WARN("failed to remove memtables from data_checkpoint", K(ret), K(key));
} else if (OB_FAIL(tablet_handle.get_obj()->wait_release_memtables())) {
LOG_ERROR("failed to release memtables", K(ret), K(tablet_id));
} else if (OB_FAIL(tablet_handle.get_obj()->get_meta_disk_addr(tablet_addr))) {
LOG_WARN("failed to get tablet addr", K(ret), K(key));
} else if (!tablet_addr.is_disked()) {

View File

@ -294,7 +294,6 @@ public:
{ // do nothing
return OB_NOT_SUPPORTED;
}
virtual int remove_memtables_from_data_checkpoint() { return OB_SUCCESS; }
virtual int set_frozen_for_all_memtables() { return OB_SUCCESS; }
DECLARE_VIRTUAL_TO_STRING;
protected:

View File

@ -1927,6 +1927,33 @@ int ObTablet::release_memtables()
return ret;
}
int ObTablet::wait_release_memtables()
{
int ret = OB_SUCCESS;
ObIMemtableMgr *memtable_mgr = nullptr;
if (IS_NOT_INIT) {
ret = OB_NOT_INIT;
LOG_WARN("not inited", K(ret), K_(is_inited));
} else if (OB_FAIL(get_memtable_mgr(memtable_mgr))) {
LOG_WARN("failed to get memtable mgr", K(ret));
} else {
const int64_t start = ObTimeUtility::current_time();
do {
if (OB_FAIL(memtable_mgr->release_memtables())) {
const int64_t cost_time = ObTimeUtility::current_time() - start;
if (cost_time > 1000 * 1000) {
if (TC_REACH_TIME_INTERVAL(1000 * 1000)) {
LOG_WARN("failed to release memtables", K(ret), KPC(memtable_mgr));
}
}
}
} while (OB_FAIL(ret));
}
return ret;
}
int ObTablet::reset_storage_related_member()
{
int ret = OB_SUCCESS;
@ -3351,23 +3378,6 @@ int ObTablet::clear_memtables_on_table_store() // be careful to call this func
}
return ret;
}
int ObTablet::remove_memtables_from_data_checkpoint()
{
int ret = OB_SUCCESS;
ObIMemtableMgr *memtable_mgr = nullptr;
if (OB_UNLIKELY(!is_inited_)) {
ret = OB_NOT_INIT;
LOG_WARN("not inited", K(ret), K_(is_inited));
} else if (OB_FAIL(get_memtable_mgr(memtable_mgr))) {
LOG_WARN("failed to get memtable mgr", K(ret));
} else if (OB_FAIL(memtable_mgr->remove_memtables_from_data_checkpoint())){
LOG_WARN("failed to remove memtables from data_checkpoint", K(ret));
}
return ret;
}
// only check storage_schema & medium_list when ha_status is none
int ObTablet::check_valid() const
{

View File

@ -235,6 +235,7 @@ public:
// force release all memtables
// just for rebuild or migrate retry.
int release_memtables();
int wait_release_memtables();
int reset_storage_related_member();
// multi-source data operation
@ -389,7 +390,6 @@ public:
int set_memtable_clog_checkpoint_scn(
const ObMigrationTabletParam *tablet_meta);
int clear_memtables_on_table_store(); // be careful to call this func, will destroy memtables array on table_store
int remove_memtables_from_data_checkpoint();
int set_frozen_for_all_memtables();
// different from the is_valid() function
// typically used for check valid for migration or restore

View File

@ -686,35 +686,6 @@ void ObTabletMemtableMgr::wait_memtable_mgr_op_cnt_(memtable::ObMemtable *memtab
}
}
int ObTabletMemtableMgr::remove_memtables_from_data_checkpoint()
{
int ret = OB_SUCCESS;
MemMgrWLockGuard lock_guard(lock_);
if (IS_NOT_INIT) {
ret = OB_NOT_INIT;
STORAGE_LOG(WARN, "not inited", K(ret));
} else if (OB_ISNULL(ls_)) {
ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(WARN, "ls is null", K(ret));
} else {
const share::ObLSID &ls_id = ls_->get_ls_id();
for (int64_t i = memtable_head_; OB_SUCC(ret) && i < memtable_tail_; ++i) {
// memtable that cannot be released will block memtables behind it
ObMemtable *memtable = static_cast<memtable::ObMemtable *>(tables_[get_memtable_idx(i)]);
if (OB_ISNULL(memtable)) {
ret = OB_ERR_UNEXPECTED;
STORAGE_LOG(WARN, "memtable is nullptr", K(ret), K(ls_id), KP(memtable), K(i));
} else {
STORAGE_LOG(INFO, "remove memtable from data_checkpoint", K(ls_id), K(i), K(*memtable));
memtable->remove_from_data_checkpoint();
}
}
}
return ret;
}
int ObTabletMemtableMgr::get_first_frozen_memtable(ObTableHandleV2 &handle) const
{
int ret = OB_SUCCESS;

View File

@ -103,7 +103,6 @@ public:
const lib::Worker::CompatMode compat_mode,
logservice::ObLogHandler *log_handler) override;
virtual int reset_storage_recorder() override;
virtual int remove_memtables_from_data_checkpoint() override;
virtual int set_frozen_for_all_memtables() override;
DECLARE_VIRTUAL_TO_STRING;