From d67e34bdaa6964cf44eca67d1fa11c7f7ded4eaa Mon Sep 17 00:00:00 2001 From: chinaxing Date: Thu, 24 Nov 2022 12:05:44 +0000 Subject: [PATCH] [4.x] fix try commit tx on local will fail when partition has migrated out --- src/storage/tx/ob_trans_service_v4.cpp | 28 +++++++++++++++----------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/storage/tx/ob_trans_service_v4.cpp b/src/storage/tx/ob_trans_service_v4.cpp index 2a96d154d..9954e80e2 100644 --- a/src/storage/tx/ob_trans_service_v4.cpp +++ b/src/storage/tx/ob_trans_service_v4.cpp @@ -1820,6 +1820,16 @@ int ObTransService::handle_tx_batch_req(int msg_type, #undef CASE__ return ret; } + +#define COMMON_RETRYABLE_ERROR(ret) \ + (OB_NOT_MASTER == ret \ + || OB_EAGAIN == ret \ + || OB_NEED_RETRY == ret \ + || OB_LS_NOT_EXIST == ret \ + || OB_PARTITION_NOT_EXIST == ret \ + || OB_TENANT_NOT_EXIST == ret \ + ) + int ObTransService::handle_sp_rollback_resp(const share::ObLSID &ls_id, const int64_t epoch, const transaction::ObTransID &tx_id, @@ -1840,17 +1850,9 @@ int ObTransService::handle_sp_rollback_resp(const share::ObLSID &ls_id, } else if (tx->op_sn_ > request_id) { TRANS_LOG(WARN, "receive old rpc result msg", K(ret), K_(tx->op_sn), K(request_id), K(tx_id)); - } else if (status == OB_TRANS_RPC_TIMEOUT) { - // ignore, waiter will drive retry - } else if (status == OB_NEED_RETRY) { - // ignore, waiter will retry periodically - // FIXME: may cause rollback slow - } else if (status == OB_NOT_MASTER) { - // ignore, waiter will drive retry - } else if (status == OB_LS_NOT_EXIST || status == OB_PARTITION_NOT_EXIST) { - TRANS_LOG(WARN, "ls not exist on receiver", K(status), K(ls_id), K(tx_id), K(addr)); - } else if (status == OB_TENANT_NOT_EXIST) { - TRANS_LOG(WARN, "tenant not exist on receiver", K(status), K(ls_id), K(tx_id), K(addr)); + } else if (status == OB_TRANS_RPC_TIMEOUT || COMMON_RETRYABLE_ERROR(status)) { + TRANS_LOG(WARN, "rollback savepoint on ls return an retryable error", + K(status), K(ls_id), K(tx_id), K(addr)); } else if (status == OB_SUCCESS) { ObTxLSEpochPair pair(ls_id, epoch); if (tx->brpc_mask_set_.is_mask(pair)) { @@ -2039,7 +2041,9 @@ int ObTransService::gen_trans_id_(ObTransID &trans_id) bool ObTransService::commit_need_retry_(const int ret) { - return OB_NOT_MASTER == ret || OB_BLOCK_FROZEN == ret || OB_TX_NOLOGCB == ret || OB_EAGAIN == ret; + return OB_TX_NOLOGCB == ret + || OB_BLOCK_FROZEN == ret + || COMMON_RETRYABLE_ERROR(ret); } int ObTransService::get_min_uncommit_tx_prepare_version(const share::ObLSID& ls_id, int64_t &min_prepare_version)