提交 a4895d26 编写于 作者: O obdev 提交者: ob-robot

Fix the error code of xa end trans

上级 c52ba1d6
......@@ -2325,7 +2325,10 @@ int ObXACtx::one_phase_end_trans(const ObXATransID &xid,
} else if (OB_FAIL(check_terminated_())) {
TRANS_LOG(WARN, "check terminated failed", K(ret), K(*this));
} else if (OB_FAIL(check_trans_state_(is_rollback, request_id, true))) {
TRANS_LOG(WARN, "check trans state failed", K(ret), K(*this));
if (!((is_rollback && OB_TRANS_ROLLBACKED == ret)
|| (!is_rollback && OB_TRANS_COMMITED == ret))) {
TRANS_LOG(WARN, "check trans state failed", K(ret), K(*this));
}
} else if (OB_FAIL(is_one_phase_end_trans_allowed_(xid, is_rollback))) {
TRANS_LOG(WARN, "one phase xa end trans is not allowed", K(ret), K(xid), K(*this));
} else {
......@@ -2337,7 +2340,7 @@ int ObXACtx::one_phase_end_trans(const ObXATransID &xid,
}
}
if (OB_FAIL(ret)) {
if (OB_FAIL(ret) && OB_EAGAIN != ret) {
if (is_rollback && is_tightly_coupled_) {
set_terminated_();
}
......@@ -2844,7 +2847,10 @@ int ObXACtx::two_phase_end_trans(const ObXATransID &xid,
ret = OB_NOT_INIT;
TRANS_LOG(WARN, "xa ctx not inited", K(ret), K(*this));
} else if (OB_FAIL(check_trans_state_(is_rollback, request_id, false))) {
TRANS_LOG(WARN, "check trans state fail", K(ret), K(xid), K(is_rollback), K(timeout_us));
if (!((is_rollback && OB_TRANS_ROLLBACKED == ret)
|| (!is_rollback && OB_TRANS_COMMITED == ret))) {
TRANS_LOG(WARN, "check trans state fail", K(ret), K(xid), K(is_rollback), K(timeout_us));
}
} else {
ObTxDesc *tx = NULL;
if (OB_FAIL(MTL(ObTransService*)->end_two_phase_tx(trans_id_, xid, coord, timeout_us,
......@@ -2965,12 +2971,12 @@ int ObXACtx::check_trans_state_(const bool is_rollback,
}
case ObXATransState::COMMITTING:
case ObXATransState::COMMITTED: {
ret = OB_TRANS_COMMITED;
ret = OB_TRANS_XA_PROTO;
break;
}
case ObXATransState::ACTIVE: {
if (!is_xa_one_phase) {
ret = OB_ERR_UNEXPECTED;
ret = OB_TRANS_XA_RMFAIL;
} else {
ret = OB_SUCCESS;
}
......@@ -2992,6 +2998,7 @@ int ObXACtx::check_trans_state_(const bool is_rollback,
if (request_id_ == request_id) {
ret = OB_EAGAIN;
} else {
// todo lixinze:error or not
if (is_xa_one_phase_) {
ret = OB_TRANS_ROLLBACKED;
} else {
......@@ -3002,19 +3009,19 @@ int ObXACtx::check_trans_state_(const bool is_rollback,
}
case ObXATransState::NON_EXISTING:
case ObXATransState::IDLE: {
ret = OB_ERR_UNEXPECTED;
ret = OB_TRANS_XA_RMFAIL;
break;
}
case ObXATransState::UNKNOWN: {
if (!is_xa_one_phase) {
ret = OB_SUCCESS;
} else {
ret = OB_ERR_UNEXPECTED;
ret = OB_TRANS_XA_RMFAIL;
}
break;
}
default: {
ret = OB_ERR_UNEXPECTED;
ret = OB_TRANS_XA_RMFAIL;
break;
}
}
......@@ -3022,7 +3029,7 @@ int ObXACtx::check_trans_state_(const bool is_rollback,
switch (xa_trans_state_) {
case ObXATransState::PREPARING:{
if (!is_xa_one_phase) {
ret = OB_ERR_UNEXPECTED;
ret = OB_TRANS_XA_RMFAIL;
} else {
ret = OB_SUCCESS;
}
......@@ -3045,11 +3052,11 @@ int ObXACtx::check_trans_state_(const bool is_rollback,
break;
}
case ObXATransState::PREPARED: {
ret = OB_ERR_UNEXPECTED;
ret = OB_TRANS_XA_RMFAIL;
break;
}
case ObXATransState::ROLLBACKED: {
ret = OB_TRANS_ROLLBACKED;
ret = OB_TRANS_XA_PROTO;
break;
}
case ObXATransState::ROLLBACKING: {
......@@ -3058,7 +3065,7 @@ int ObXACtx::check_trans_state_(const bool is_rollback,
}
case ObXATransState::ACTIVE: {
if (!is_xa_one_phase) {
ret = OB_ERR_UNEXPECTED;
ret = OB_TRANS_XA_RMFAIL;
} else {
ret = OB_SUCCESS;
}
......@@ -3066,19 +3073,19 @@ int ObXACtx::check_trans_state_(const bool is_rollback,
}
case ObXATransState::NON_EXISTING:
case ObXATransState::IDLE: {
ret = OB_ERR_UNEXPECTED;
ret = OB_TRANS_XA_RMFAIL;
break;
}
case ObXATransState::UNKNOWN: {
if (!is_xa_one_phase) {
ret = OB_SUCCESS;
} else {
ret = OB_ERR_UNEXPECTED;
ret = OB_TRANS_XA_RMFAIL;
}
break;
}
default: {
ret = OB_ERR_UNEXPECTED;
ret = OB_TRANS_XA_RMFAIL;
break;
}
}
......
......@@ -362,7 +362,11 @@ int ObXACommitP::process()
TRANS_LOG(WARN, "xa ctx is null", K(ret), K(arg_));
} else {
if (OB_FAIL(xa_ctx->one_phase_end_trans(xid, false/*is_rollback*/, timeout_us, request_id))) {
TRANS_LOG(WARN, "one phase end trans failed", K(ret), K(xid));
if (OB_TRANS_COMMITED != ret) {
TRANS_LOG(WARN, "one phase xa commit failed", K(ret), K(xid));
} else {
ret = OB_SUCCESS;
}
} else if (OB_FAIL(xa_ctx->wait_one_phase_end_trans(false/*is_rollback*/, timeout_us))) {
TRANS_LOG(WARN, "fail to wait one phase xa end trans", K(ret), K(xid));
}
......
......@@ -1630,10 +1630,17 @@ int ObXAService::xa_rollback_for_pending_trans_(const ObXATransID &xid,
TRANS_LOG(WARN, "xa ctx init failed", K(ret), K(xid), K(tx_id));
} else {
if (OB_FAIL(xa_ctx->two_phase_end_trans(xid, coord, true/*is_rollback*/, timeout_us, request_id))) {
TRANS_LOG(WARN, "xa rollback failed", K(ret), K(xid), K(tx_id));
if (OB_TRANS_ROLLBACKED != ret) {
TRANS_LOG(WARN, "xa rollback failed", K(ret), K(xid), K(tx_id));
} else {
ret = OB_SUCCESS;
}
} else if (OB_FAIL(xa_ctx->wait_two_phase_end_trans(xid, true/*is_rollback*/, timeout_us))) {
TRANS_LOG(WARN, "wait xa rollback failed", K(ret), K(xid), K(tx_id));
} else {
// do nothing
}
if (OB_SUCC(ret)) {
int tmp_ret = OB_SUCCESS;
if (OB_SUCCESS != (tmp_ret = delete_xa_pending_record(tenant_id, tx_id))) {
TRANS_LOG(WARN, "fail to delete xa record from pending trans", K(ret), K(xid), K(tx_id));
......@@ -1732,7 +1739,12 @@ int ObXAService::two_phase_xa_rollback_(const ObXATransID &xid,
TRANS_LOG(WARN, "xa ctx init failed", K(ret), K(xid), K(tx_id));
} else {
if (OB_FAIL(xa_ctx->two_phase_end_trans(xid, coord, true/*is_rollback*/, timeout_us, request_id))) {
TRANS_LOG(WARN, "two phase xa rollback failed", K(ret), K(xid), K(tx_id));
if (OB_TRANS_ROLLBACKED != ret) {
TRANS_LOG(WARN, "two phase xa rollback failed", K(ret), K(xid), K(tx_id));
} else {
ret = OB_SUCCESS;
TRANS_LOG(INFO, "two phase xa rollback success", K(ret), K(xid), K(tx_id));
}
} else if (OB_FAIL(xa_ctx->wait_two_phase_end_trans(xid, true/*is_rollback*/, timeout_us))) {
TRANS_LOG(WARN, "wait two phase xa rollback failed", K(ret), K(xid), K(tx_id));
} else {
......@@ -1797,7 +1809,11 @@ int ObXAService::one_phase_xa_rollback_(const ObXATransID &xid,
} else {
// if there exists xa ctx, one phase xa rollback is required
if (OB_FAIL(xa_ctx->one_phase_end_trans(xid, true/*is_rollback*/, timeout_us, request_id))) {
TRANS_LOG(WARN, "one phase xa rollback failed", K(ret), K(tx_id));
if (OB_TRANS_ROLLBACKED != ret) {
TRANS_LOG(WARN, "one phase xa rollback failed", K(ret), K(tx_id));
} else {
ret = OB_SUCCESS;
}
} else if (OB_FAIL(xa_ctx->wait_one_phase_end_trans(true/*is_rollback*/, timeout_us))) {
TRANS_LOG(WARN, "fail to wait one phase xa end trans", K(ret), K(xid), K(tx_id));
}
......@@ -1839,16 +1855,8 @@ int ObXAService::xa_rollback_remote_(const ObXATransID &xid,
if (OB_SUCC(ret)) {
switch (result) {
case OB_TRANS_XA_PROTO:
case OB_TRANS_COMMITED: {
ret = OB_TRANS_XA_PROTO;
TRANS_LOG(WARN, "xa rollback failed", KR(ret), K(result), K(sche_addr));
break;
}
case OB_SUCCESS:
case OB_TRANS_ROLLBACKED: {
ret = OB_SUCCESS;
TRANS_LOG(WARN, "xa rollback success", KR(ret), K(result), K(sche_addr));
case OB_SUCCESS: {
// do nothing
break;
}
case OB_TIMEOUT:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册