[4.x] fix try commit tx on local will fail when partition has migrated out
This commit is contained in:
		| @ -1820,6 +1820,16 @@ int ObTransService::handle_tx_batch_req(int msg_type, | |||||||
| #undef CASE__ | #undef CASE__ | ||||||
|   return ret; |   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, | int ObTransService::handle_sp_rollback_resp(const share::ObLSID &ls_id, | ||||||
|                                             const int64_t epoch, |                                             const int64_t epoch, | ||||||
|                                             const transaction::ObTransID &tx_id, |                                             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) { |     } else if (tx->op_sn_ > request_id) { | ||||||
|       TRANS_LOG(WARN, "receive old rpc result msg", |       TRANS_LOG(WARN, "receive old rpc result msg", | ||||||
|                 K(ret), K_(tx->op_sn), K(request_id), K(tx_id)); |                 K(ret), K_(tx->op_sn), K(request_id), K(tx_id)); | ||||||
|     } else if (status == OB_TRANS_RPC_TIMEOUT) { |     } else if (status == OB_TRANS_RPC_TIMEOUT || COMMON_RETRYABLE_ERROR(status)) { | ||||||
|       // ignore, waiter will drive retry |       TRANS_LOG(WARN, "rollback savepoint on ls return an retryable error", | ||||||
|     } else if (status == OB_NEED_RETRY) { |                 K(status), K(ls_id), K(tx_id), K(addr)); | ||||||
|       // 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_SUCCESS) { |     } else if (status == OB_SUCCESS) { | ||||||
|       ObTxLSEpochPair pair(ls_id, epoch); |       ObTxLSEpochPair pair(ls_id, epoch); | ||||||
|       if (tx->brpc_mask_set_.is_mask(pair)) { |       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) | 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) | int ObTransService::get_min_uncommit_tx_prepare_version(const share::ObLSID& ls_id, int64_t &min_prepare_version) | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 chinaxing
					chinaxing