From ce6f757b1f08e8fa537fa6839d75de24f8cb9c97 Mon Sep 17 00:00:00 2001 From: yedf2 <120050102@qq.com> Date: Wed, 2 Feb 2022 21:35:54 +0800 Subject: [PATCH] partial recover refactored --- dtmcli/barrier.go | 16 +++++----------- dtmcli/dtmimp/utils.go | 13 +++++++++++++ dtmcli/tcc.go | 16 +++++----------- 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/dtmcli/barrier.go b/dtmcli/barrier.go index a017b64..251611d 100644 --- a/dtmcli/barrier.go +++ b/dtmcli/barrier.go @@ -64,17 +64,11 @@ func insertBarrier(tx DB, transType string, gid string, branchID string, op stri func (bb *BranchBarrier) Call(tx *sql.Tx, busiCall BarrierBusiFunc) (rerr error) { bb.BarrierID = bb.BarrierID + 1 bid := fmt.Sprintf("%02d", bb.BarrierID) - defer func() { - // Logf("barrier call error is %v", rerr) - if x := recover(); x != nil { - _ = tx.Rollback() - panic(x) - } else if rerr != nil { - _ = tx.Rollback() - } else { - rerr = tx.Commit() - } - }() + defer dtmimp.DeferDo(&rerr, func() error { + return tx.Commit() + }, func() error { + return tx.Rollback() + }) ti := bb originOp := map[string]string{ BranchCancel: BranchTry, diff --git a/dtmcli/dtmimp/utils.go b/dtmcli/dtmimp/utils.go index d4fb44e..ff28f9e 100644 --- a/dtmcli/dtmimp/utils.go +++ b/dtmcli/dtmimp/utils.go @@ -219,3 +219,16 @@ func RespAsErrorCompatible(resp *resty.Response) error { } return nil } + +func DeferDo(rerr *error, success func() error, fail func() error) { + defer func() { + if x := recover(); x != nil { + _ = fail() + panic(x) + } else if *rerr != nil { + _ = fail() + } else { + *rerr = success() + } + }() +} diff --git a/dtmcli/tcc.go b/dtmcli/tcc.go index 67bcbad..7d0c77d 100644 --- a/dtmcli/tcc.go +++ b/dtmcli/tcc.go @@ -39,17 +39,11 @@ func TccGlobalTransaction2(dtm string, gid string, custom func(*Tcc), tccFunc Tc return rerr } // 小概率情况下,prepare成功了,但是由于网络状况导致上面Failure,那么不执行下面defer的内容,等待超时后再回滚标记事务失败,也没有问题 - defer func() { - x := recover() - operation := dtmimp.If(x == nil && rerr == nil, "submit", "abort").(string) - err := dtmimp.TransCallDtm(&tcc.TransBase, tcc, operation) - if rerr == nil { - rerr = err - } - if x != nil { - panic(x) - } - }() + defer dtmimp.DeferDo(&rerr, func() error { + return dtmimp.TransCallDtm(&tcc.TransBase, tcc, "submit") + }, func() error { + return dtmimp.TransCallDtm(&tcc.TransBase, tcc, "abort") + }) _, rerr = tccFunc(tcc) return }