From 1676fe298a3a327654c09fbf53a31a6e06ce95c3 Mon Sep 17 00:00:00 2001 From: chinaxing Date: Sat, 28 Jan 2023 19:35:06 +0800 Subject: [PATCH] [master] fix commit retry interval --- src/storage/tx/ob_trans_service_v4.cpp | 13 ++++++++----- src/storage/tx/ob_trans_service_v4.h | 2 +- src/storage/tx/ob_trans_timer.h | 1 + 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/storage/tx/ob_trans_service_v4.cpp b/src/storage/tx/ob_trans_service_v4.cpp index 8f10f28468..81b61e5758 100644 --- a/src/storage/tx/ob_trans_service_v4.cpp +++ b/src/storage/tx/ob_trans_service_v4.cpp @@ -258,16 +258,19 @@ int ObTransService::do_commit_tx_slowpath_(ObTxDesc &tx, const int64_t expire_ts return ret; } -int ObTransService::register_commit_retry_task_(ObTxDesc &tx, const int64_t max_delay) +int ObTransService::register_commit_retry_task_(ObTxDesc &tx, int64_t max_delay) { + const int64_t MIN_DELAY = 50 * 1000;// 50ms int ret = OB_SUCCESS; - int64_t delay = ObTransCtx::MAX_TRANS_2PC_TIMEOUT_US; + max_delay = max_delay == INT64_MAX ? ObTransCtx::MAX_TRANS_2PC_TIMEOUT_US : max_delay; int64_t now = ObClockGenerator::getClock(); int64_t expire_after = std::min(tx.expire_ts_ - now, tx.commit_expire_ts_ - now); - if (expire_after > 0) { // KEEP delay always > 0 - delay = std::min(delay, expire_after); + int64_t delay = std::min(max_delay, tx.commit_task_.get_delay() * 2); + if (expire_after > 0) { delay = std::min(delay, expire_after); } + delay = std::max(delay, MIN_DELAY); + if (delay != MIN_DELAY) { + delay = ObRandom::rand(MIN_DELAY, delay); } - delay = std::min(delay, max_delay); if (OB_FAIL(tx_desc_mgr_.acquire_tx_ref(tx.tx_id_))) { TRANS_LOG(WARN, "acquire tx ref fail", KR(ret), K(tx)); } else { diff --git a/src/storage/tx/ob_trans_service_v4.h b/src/storage/tx/ob_trans_service_v4.h index 5ac0c2816d..05704cfe37 100644 --- a/src/storage/tx/ob_trans_service_v4.h +++ b/src/storage/tx/ob_trans_service_v4.h @@ -247,7 +247,7 @@ int do_commit_tx_(ObTxDesc &tx, ObITxCallback &cb, share::SCN &commit_version); int do_commit_tx_slowpath_(ObTxDesc &tx, const int64_t expire_ts); -int register_commit_retry_task_(ObTxDesc &tx, const int64_t max_delay = INT64_MAX); +int register_commit_retry_task_(ObTxDesc &tx, int64_t max_delay = INT64_MAX); int unregister_commit_retry_task_(ObTxDesc &tx); int handle_tx_commit_result_(ObTxDesc &tx, const int result, diff --git a/src/storage/tx/ob_trans_timer.h b/src/storage/tx/ob_trans_timer.h index f8b20e55fb..9d989dd5b0 100644 --- a/src/storage/tx/ob_trans_timer.h +++ b/src/storage/tx/ob_trans_timer.h @@ -50,6 +50,7 @@ public: void set_running(const bool is_running) { is_running_ = is_running; } bool is_running() const { return is_running_; } void set_delay(const int64_t delay) { delay_ = delay; } + int64_t get_delay() const { return delay_; } protected: bool is_registered_; bool is_running_;