diff --git a/src/storage/ls/ob_ls.h b/src/storage/ls/ob_ls.h index b2c0820e8c8fd7a7885770db4755e13a59b161a7..12fcf51430b1fe29b68d9e01f8945187086dd200 100644 --- a/src/storage/ls/ob_ls.h +++ b/src/storage/ls/ob_ls.h @@ -602,8 +602,6 @@ public: // ObFreezer interface: // logstream freeze // @param [in] null - // int logstream_freeze(); - // DELEGATE_WITH_RET(ls_freezer_, logstream_freeze, int); int logstream_freeze(); // tablet freeze // @param [in] tablet_id diff --git a/src/storage/tx_storage/ob_tenant_freezer.cpp b/src/storage/tx_storage/ob_tenant_freezer.cpp index b8dedb37a28f2676a75d97060282ad774a7c31e3..d3e6250c693cf04c17fd043e31230ac810c11fce 100644 --- a/src/storage/tx_storage/ob_tenant_freezer.cpp +++ b/src/storage/tx_storage/ob_tenant_freezer.cpp @@ -186,6 +186,24 @@ bool ObTenantFreezer::exist_ls_freezing() return exist_ls_freezing_; } +int ObTenantFreezer::ls_freeze_(ObLS *ls) +{ + int ret = OB_SUCCESS; + const int64_t SLEEP_TS = 1000 * 1000; // 1s + int64_t retry_times = 0; + // wait if there is a freeze is doing + do { + retry_times++; + if (OB_FAIL(ls->logstream_freeze()) && OB_ENTRY_EXIST == ret) { + ob_usleep(SLEEP_TS); + } + if (retry_times % 10 == 0) { + LOG_WARN("wait ls freeze finished cost too much time", K(retry_times)); + } + } while (ret == OB_ENTRY_EXIST); + return ret; +} + int ObTenantFreezer::tenant_freeze() { int ret = OB_SUCCESS; @@ -203,7 +221,9 @@ int ObTenantFreezer::tenant_freeze() ObLS *ls = nullptr; int ls_cnt = 0; for (; OB_SUCC(iter->get_next(ls)); ++ls_cnt) { - if (OB_FAIL(ls->logstream_freeze())) { + // wait until this ls freeze finished to make sure not freeze frequently because + // of this ls freeze stuck. + if (OB_FAIL(ls_freeze_(ls))) { if (OB_SUCCESS == first_fail_ret) { first_fail_ret = ret; } diff --git a/src/storage/tx_storage/ob_tenant_freezer.h b/src/storage/tx_storage/ob_tenant_freezer.h index c01b712cc980107620ebb02956b63b3d19d057f5..df0067b525fad82fefa179ea9a72b543c86652e4 100644 --- a/src/storage/tx_storage/ob_tenant_freezer.h +++ b/src/storage/tx_storage/ob_tenant_freezer.h @@ -128,6 +128,7 @@ public: ObServerConfig *get_config() { return config_; } bool exist_ls_freezing(); private: + int ls_freeze_(ObLS *ls); int64_t get_freeze_trigger_percentage_() const; int post_freeze_request_(const storage::ObFreezeType freeze_type, const int64_t try_frozen_version);