From 585178507b19c4a2bf98dcd5d9e4bee30e8cf651 Mon Sep 17 00:00:00 2001 From: obdev Date: Thu, 3 Nov 2022 14:40:35 +0000 Subject: [PATCH] BUGFIX: prevent frequent freeze if ls freeze stuck --- src/storage/ls/ob_ls.h | 2 -- src/storage/tx_storage/ob_tenant_freezer.cpp | 22 +++++++++++++++++++- src/storage/tx_storage/ob_tenant_freezer.h | 1 + 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/storage/ls/ob_ls.h b/src/storage/ls/ob_ls.h index b2c0820e8c..12fcf51430 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 b8dedb37a2..d3e6250c69 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 c01b712cc9..df0067b525 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); -- GitLab