Browse Source

partial recover refactored

pull/201/head
yedf2 4 years ago
parent
commit
ce6f757b1f
  1. 16
      dtmcli/barrier.go
  2. 13
      dtmcli/dtmimp/utils.go
  3. 16
      dtmcli/tcc.go

16
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,

13
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()
}
}()
}

16
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
}

Loading…
Cancel
Save