diff --git a/src/storage/ls/ob_ls_tablet_service.cpp b/src/storage/ls/ob_ls_tablet_service.cpp index cbfb9a27f..a43a821fe 100644 --- a/src/storage/ls/ob_ls_tablet_service.cpp +++ b/src/storage/ls/ob_ls_tablet_service.cpp @@ -554,8 +554,8 @@ int ObLSTabletService::remove_tablets(const common::ObIArray } 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()) { diff --git a/src/storage/ob_i_memtable_mgr.h b/src/storage/ob_i_memtable_mgr.h index 59d0fd114..a696625bd 100644 --- a/src/storage/ob_i_memtable_mgr.h +++ b/src/storage/ob_i_memtable_mgr.h @@ -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: diff --git a/src/storage/tablet/ob_tablet.cpp b/src/storage/tablet/ob_tablet.cpp index 237d1edc5..c8d2445de 100644 --- a/src/storage/tablet/ob_tablet.cpp +++ b/src/storage/tablet/ob_tablet.cpp @@ -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 { diff --git a/src/storage/tablet/ob_tablet.h b/src/storage/tablet/ob_tablet.h index 43ad7c5f6..967d00380 100644 --- a/src/storage/tablet/ob_tablet.h +++ b/src/storage/tablet/ob_tablet.h @@ -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 diff --git a/src/storage/tablet/ob_tablet_memtable_mgr.cpp b/src/storage/tablet/ob_tablet_memtable_mgr.cpp index b91b4c20b..06705f580 100644 --- a/src/storage/tablet/ob_tablet_memtable_mgr.cpp +++ b/src/storage/tablet/ob_tablet_memtable_mgr.cpp @@ -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(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; diff --git a/src/storage/tablet/ob_tablet_memtable_mgr.h b/src/storage/tablet/ob_tablet_memtable_mgr.h index 8f45d5895..332b4454a 100644 --- a/src/storage/tablet/ob_tablet_memtable_mgr.h +++ b/src/storage/tablet/ob_tablet_memtable_mgr.h @@ -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;