diff --git a/src/storage/memtable/ob_memtable.cpp b/src/storage/memtable/ob_memtable.cpp index 6d57c8328f..7e70de26c0 100644 --- a/src/storage/memtable/ob_memtable.cpp +++ b/src/storage/memtable/ob_memtable.cpp @@ -218,11 +218,15 @@ void ObMemtable::destroy() ObTimeGuard time_guard("ObMemtable::destroy()", 100 * 1000); int ret = OB_SUCCESS; if (is_inited_) { + const common::ObTabletID tablet_id = key_.tablet_id_; + const int64_t cost_time = ObTimeUtility::current_time() - mt_stat_.release_time_; + if (cost_time > 1 * 1000 * 1000) { + STORAGE_LOG(WARN, "it costs too much time from release to destroy", K(cost_time), K(tablet_id), KP(this)); + } STORAGE_LOG(INFO, "memtable destroyed", K(*this)); time_guard.click(); ObMemtableStat::get_instance().unregister_memtable(this); time_guard.click(); - const common::ObTabletID tablet_id = key_.tablet_id_; ObTenantFreezer *freezer = nullptr; freezer = MTL(ObTenantFreezer *); if (OB_SUCCESS != freezer->unset_tenant_slow_freeze(tablet_id)) { diff --git a/src/storage/memtable/ob_memtable.h b/src/storage/memtable/ob_memtable.h index 12756f1a56..1954afd224 100644 --- a/src/storage/memtable/ob_memtable.h +++ b/src/storage/memtable/ob_memtable.h @@ -466,7 +466,7 @@ public: bool &is_all_delay_cleanout, int64_t &count); int dump2text(const char *fname); - INHERIT_TO_STRING_KV("ObITable", ObITable, KP(this), K_(timestamp), K_(state), + INHERIT_TO_STRING_KV("ObITable", ObITable, KP(this), KP_(memtable_mgr), K_(timestamp), K_(state), K_(freeze_clock), K_(max_schema_version), K_(write_ref_cnt), K_(local_allocator), K_(unsubmitted_cnt), K_(unsynced_cnt), K_(logging_blocked), K_(unset_active_memtable_logging_blocked), K_(resolve_active_memtable_left_boundary), diff --git a/src/storage/ob_i_memtable_mgr.cpp b/src/storage/ob_i_memtable_mgr.cpp index afa2653e7e..909538bbf7 100644 --- a/src/storage/ob_i_memtable_mgr.cpp +++ b/src/storage/ob_i_memtable_mgr.cpp @@ -349,7 +349,7 @@ int ObIMemtableMgr::add_memtable_(ObTableHandleV2 &memtable_handle) memtable_tail_++; ObTaskController::get().allow_next_syslog(); // FIXME : delete lbt() - STORAGE_LOG(INFO, "succeed to add memtable", K(get_memtable_count_()), + STORAGE_LOG(INFO, "succeed to add memtable", KP(this), K(get_memtable_count_()), K(memtable_handle), K(lbt())); } } diff --git a/src/storage/tablet/ob_tablet_memtable_mgr.cpp b/src/storage/tablet/ob_tablet_memtable_mgr.cpp index 07d38122f1..975123d4b7 100644 --- a/src/storage/tablet/ob_tablet_memtable_mgr.cpp +++ b/src/storage/tablet/ob_tablet_memtable_mgr.cpp @@ -64,6 +64,7 @@ void ObTabletMemtableMgr::destroy() } else if (imemtable->is_data_memtable()) { memtable::ObMemtable *memtable = static_cast(imemtable); memtable->remove_from_data_checkpoint(); + memtable->set_frozen(); } } reset_tables(); @@ -644,9 +645,7 @@ int ObTabletMemtableMgr::release_head_memtable_(memtable::ObIMemtable *imemtable memtable->remove_from_data_checkpoint(); memtable->set_is_flushed(); memtable->set_freeze_state(ObMemtableFreezeState::RELEASED); - if (force) { - memtable->set_frozen(); - } + memtable->set_frozen(); release_head_memtable(); FLOG_INFO("succeed to release head data memtable", K(ret), K(ls_id), K(tablet_id_)); } @@ -754,7 +753,15 @@ int64_t ObTabletMemtableMgr::get_unmerged_memtable_count_() const void ObTabletMemtableMgr::clean_tail_memtable_() { - ObIMemtableMgr::release_tail_memtable(); + if (memtable_tail_ > memtable_head_) { + ObMemtable *memtable = get_memtable_(memtable_tail_ - 1); + if (OB_NOT_NULL(memtable)) { + memtable->set_frozen(); + } else { + LOG_WARN_RET(OB_ERR_UNEXPECTED, "memtable is null when clean_tail_memtable_", KPC(this)); + } + ObIMemtableMgr::release_tail_memtable(); + } } int ObTabletMemtableMgr::get_memtables_(ObTableHdlArray &handle, const int64_t start_point,