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