diff --git a/src/storage/ob_i_memtable_mgr.h b/src/storage/ob_i_memtable_mgr.h index 5de698683..51f60f47c 100644 --- a/src/storage/ob_i_memtable_mgr.h +++ b/src/storage/ob_i_memtable_mgr.h @@ -259,7 +259,7 @@ public: virtual int get_boundary_memtable(ObTableHandleV2 &handle) { return OB_NOT_SUPPORTED; } - virtual int get_memtable_for_replay(share::SCN replay_scn, ObTableHandleV2 &handle) + virtual int get_memtable_for_replay(const share::SCN &replay_scn, ObTableHandleV2 &handle) { return OB_SUCCESS; } diff --git a/src/storage/ob_storage_table_guard.cpp b/src/storage/ob_storage_table_guard.cpp index 1391b4a3c..3e0f0d405 100644 --- a/src/storage/ob_storage_table_guard.cpp +++ b/src/storage/ob_storage_table_guard.cpp @@ -146,7 +146,7 @@ int ObStorageTableGuard::refresh_and_protect_memtable() int64_t warn_interval = DEFAULT_REFRESH_WARN_INTERVAL; do { - if (OB_FAIL(tablet_->get_boundary_memtable(handle))) { + if (OB_FAIL(tablet_->get_boundary_memtable_from_memtable_mgr(handle))) { // if there is no memtable, create a new one if (OB_ENTRY_NOT_EXIST == ret) { ret = create_data_memtable_(ls_id, tablet_id, need_retry); diff --git a/src/storage/tablet/ob_tablet.cpp b/src/storage/tablet/ob_tablet.cpp index 8a9556515..61b43982f 100644 --- a/src/storage/tablet/ob_tablet.cpp +++ b/src/storage/tablet/ob_tablet.cpp @@ -4282,29 +4282,31 @@ int ObTablet::create_memtable( LOG_WARN("failed to create memtable", K(ret), K(clog_checkpoint_scn), K(schema_version), K(for_replay)); } - } else if (FALSE_IT(time_guard.click("inner_create_memtable"))) { - } else if (OB_FAIL(update_memtables())) { - LOG_WARN("failed to append new memtable to table store", K(ret), KPC(this)); - if (OB_SIZE_OVERFLOW == ret) { - // rewrite errno to OB_EAGAIN when memtable count overflow, in case to stuck the log relpay engine - ret = OB_EAGAIN; - } - } else if (FALSE_IT(time_guard.click("update_memtables"))) { } else { - tablet_addr_.inc_seq(); - table_store_addr_.addr_.inc_seq(); - - if (table_store_addr_.is_memory_object()) { - ObSEArray memtable_array; - if (OB_FAIL(inner_get_memtables(memtable_array, true/*need_active*/))) { - LOG_WARN("inner get memtables fail", K(ret), K(*this)); - } else if (OB_FAIL(table_store_addr_.get_ptr()->update_memtables(memtable_array))) { - LOG_WARN("table store update memtables fail", K(ret), K(memtable_array)); + time_guard.click("inner_create_memtable"); + do { + if (OB_FAIL(update_memtables())) { + LOG_WARN("failed to append new memtable to table store", K(ret), KPC(this)); + } else if (FALSE_IT(time_guard.click("update_memtables"))) { } else { - time_guard.click("ts update mem"); - LOG_INFO("table store update memtable success", K(ret), K(ls_id), K(tablet_id), K_(table_store_addr), KP(this)); + tablet_addr_.inc_seq(); + table_store_addr_.addr_.inc_seq(); + if (table_store_addr_.is_memory_object()) { + ObSEArray memtable_array; + if (OB_FAIL(inner_get_memtables(memtable_array, true/*need_active*/))) { + LOG_WARN("inner get memtables fail", K(ret), K(*this)); + } else if (OB_FAIL(table_store_addr_.get_ptr()->update_memtables(memtable_array))) { + LOG_WARN("table store update memtables fail", K(ret), K(memtable_array)); + } else { + time_guard.click("ts update mem"); + LOG_INFO("table store update memtable success", K(ret), K(ls_id), K(tablet_id), K_(table_store_addr), KP(this)); + } + } } - } + if (OB_FAIL(ret) && REACH_COUNT_INTERVAL(100)) { + LOG_ERROR("fail to refresh tablet memtables, which may cause hang", K(ret), KPC(this)); + } + } while(OB_FAIL(ret)); } STORAGE_LOG(DEBUG, @@ -7359,7 +7361,7 @@ int ObTablet::get_all_memtables(ObTableHdlArray &handle) const return ret; } -int ObTablet::get_boundary_memtable(ObTableHandleV2 &handle) const +int ObTablet::get_boundary_memtable_from_memtable_mgr(ObTableHandleV2 &handle) const { int ret = OB_SUCCESS; ObProtectedMemtableMgrHandle *protected_handle = NULL; diff --git a/src/storage/tablet/ob_tablet.h b/src/storage/tablet/ob_tablet.h index 06da73a14..15e5ff999 100644 --- a/src/storage/tablet/ob_tablet.h +++ b/src/storage/tablet/ob_tablet.h @@ -347,8 +347,10 @@ public: int update_upper_trans_version(ObLS &ls, bool &is_updated); // memtable operation + // ATTENTION!!! + // - The `get_all_memtables()` is that get all memtables from memtable mgr, not from this tablet. int get_all_memtables(ObTableHdlArray &handle) const; - int get_boundary_memtable(ObTableHandleV2 &handle) const; + int get_boundary_memtable_from_memtable_mgr(ObTableHandleV2 &handle) const; int get_protected_memtable_mgr_handle(ObProtectedMemtableMgrHandle *&handle) const; // get the active memtable for write or replay. diff --git a/src/storage/tablet/ob_tablet_memtable_mgr.cpp b/src/storage/tablet/ob_tablet_memtable_mgr.cpp index ac65b1eb5..f537bf88a 100644 --- a/src/storage/tablet/ob_tablet_memtable_mgr.cpp +++ b/src/storage/tablet/ob_tablet_memtable_mgr.cpp @@ -663,7 +663,7 @@ int ObTabletMemtableMgr::set_is_tablet_freeze_for_active_memtable( return ret; } -int ObTabletMemtableMgr::get_memtable_for_replay(SCN replay_scn, ObTableHandleV2 &handle) +int ObTabletMemtableMgr::get_memtable_for_replay(const SCN &replay_scn, ObTableHandleV2 &handle) { int ret = OB_SUCCESS; ObITabletMemtable *tablet_memtable = nullptr; diff --git a/src/storage/tablet/ob_tablet_memtable_mgr.h b/src/storage/tablet/ob_tablet_memtable_mgr.h index f77679916..c0a696db2 100644 --- a/src/storage/tablet/ob_tablet_memtable_mgr.h +++ b/src/storage/tablet/ob_tablet_memtable_mgr.h @@ -67,7 +67,7 @@ public: // derived from ObIMemtableMgr virtual int get_active_memtable(ObTableHandleV2 &handle) const override; virtual int get_all_memtables(ObTableHdlArray &handle) override; virtual void destroy() override; - virtual int get_memtable_for_replay(share::SCN replay_scn, + virtual int get_memtable_for_replay(const share::SCN &replay_scn, ObTableHandleV2 &handle) override; virtual int get_boundary_memtable(ObTableHandleV2 &handle) override; virtual int create_memtable(const CreateMemtableArg &arg) override;