From c62bcba33daf99dc4c94e67c2a8fa3a14f74fda8 Mon Sep 17 00:00:00 2001 From: chinaxing Date: Thu, 13 Apr 2023 08:15:14 +0000 Subject: [PATCH] [master]fix interrupt rollback stmt hang --- src/sql/ob_sql_trans_control.cpp | 1 + src/storage/tx/ob_trans_define_v4.h | 1 + src/storage/tx/ob_trans_service_v4.cpp | 3 ++- src/storage/tx/ob_tx_api.cpp | 7 ++++++- 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/sql/ob_sql_trans_control.cpp b/src/sql/ob_sql_trans_control.cpp index 5cabfeb6c5..0ba61e8e99 100644 --- a/src/sql/ob_sql_trans_control.cpp +++ b/src/sql/ob_sql_trans_control.cpp @@ -527,6 +527,7 @@ int ObSqlTransControl::start_stmt(ObExecContext &exec_ctx) OX (session_id = session->get_sessid()); OX (tx_desc = session->get_tx_desc()); OX (is_plain_select = plan->is_plain_select()); + OX (tx_desc->clear_interrupt()); if (OB_SUCC(ret) && !is_plain_select) { OZ (stmt_setup_savepoint_(session, das_ctx, plan_ctx, txs, nested_level), session_id, *tx_desc); } diff --git a/src/storage/tx/ob_trans_define_v4.h b/src/storage/tx/ob_trans_define_v4.h index f074669ece..bc5d3c84a1 100644 --- a/src/storage/tx/ob_trans_define_v4.h +++ b/src/storage/tx/ob_trans_define_v4.h @@ -660,6 +660,7 @@ LST_DO(DEF_FREE_ROUTE_DECODE, (;), static, dynamic, parts, extra); bool is_parts_changed() { return state_change_flags_.PARTS_CHANGED_; }; bool is_extra_changed() { return state_change_flags_.EXTRA_CHANGED_; }; void set_explicit() { flags_.EXPLICIT_ = true; } + void clear_interrupt() { flags_.INTERRUPTED_ = false; } }; // Is used to store and travserse all TxScheduler's Stat information; diff --git a/src/storage/tx/ob_trans_service_v4.cpp b/src/storage/tx/ob_trans_service_v4.cpp index d521de7788..5a29c667c9 100644 --- a/src/storage/tx/ob_trans_service_v4.cpp +++ b/src/storage/tx/ob_trans_service_v4.cpp @@ -819,8 +819,8 @@ int ObTransService::interrupt(ObTxDesc &tx, int cause) bool busy_wait = false; { ObSpinLockGuard guard(tx.lock_); + tx.flags_.INTERRUPTED_ = true; if (tx.flags_.BLOCK_) { - tx.flags_.INTERRUPTED_ = true; TRANS_LOG(INFO, "will busy wait tx quit from block state", K(tx)); busy_wait = true; } @@ -1545,6 +1545,7 @@ int ObTransService::sync_acquire_global_snapshot_(ObTxDesc &tx, [&]() -> bool { return tx.flags_.INTERRUPTED_; }); tx.lock_.lock(); bool interrupted = tx.flags_.INTERRUPTED_; + tx.clear_interrupt(); tx.flags_.BLOCK_ = false; if (OB_SUCC(ret)) { if (op_sn != tx.op_sn_) { diff --git a/src/storage/tx/ob_tx_api.cpp b/src/storage/tx/ob_tx_api.cpp index 41bd4a5e18..7485126e5d 100644 --- a/src/storage/tx/ob_tx_api.cpp +++ b/src/storage/tx/ob_tx_api.cpp @@ -1511,6 +1511,11 @@ inline int ObTransService::rollback_savepoint_slowpath_(ObTxDesc &tx, } int64_t start_ts = ObTimeUtility::current_time(); int retries = 0; + if (OB_UNLIKELY(tx.flags_.INTERRUPTED_)) { + ret = OB_ERR_INTERRUPTED; + tx.clear_interrupt(); + TRANS_LOG(WARN, "interrupted", K(ret), K(tx)); + } if (OB_SUCC(ret)) { // setup state before release lock auto save_state = tx.state_; @@ -1529,7 +1534,7 @@ inline int ObTransService::rollback_savepoint_slowpath_(ObTxDesc &tx, // mask_set need clear tx.brpc_mask_set_.reset(); // clear interrupt flag - tx.flags_.INTERRUPTED_ = false; + tx.clear_interrupt(); } if (OB_NOT_NULL(tmp_tx_desc)) { msg.tx_ptr_ = NULL;