Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
clmforever
oceanbase
提交
a4895d26
O
oceanbase
项目概览
clmforever
/
oceanbase
与 Fork 源项目一致
Fork自
oceanbase / oceanbase
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
O
oceanbase
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
a4895d26
编写于
3月 02, 2023
作者:
O
obdev
提交者:
ob-robot
3月 02, 2023
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix the error code of xa end trans
上级
c52ba1d6
变更
3
显示空白变更内容
内联
并排
Showing
3 changed file
with
48 addition
and
29 deletion
+48
-29
src/storage/tx/ob_xa_ctx.cpp
src/storage/tx/ob_xa_ctx.cpp
+22
-15
src/storage/tx/ob_xa_rpc.cpp
src/storage/tx/ob_xa_rpc.cpp
+5
-1
src/storage/tx/ob_xa_service.cpp
src/storage/tx/ob_xa_service.cpp
+21
-13
未找到文件。
src/storage/tx/ob_xa_ctx.cpp
浏览文件 @
a4895d26
...
...
@@ -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
)))
{
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
)))
{
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
;
}
}
...
...
src/storage/tx/ob_xa_rpc.cpp
浏览文件 @
a4895d26
...
...
@@ -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
));
}
...
...
src/storage/tx/ob_xa_service.cpp
浏览文件 @
a4895d26
...
...
@@ -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
)))
{
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
)))
{
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
)))
{
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录