From 5eabe6239f4a066cc10c44faf2bef2947f04fe3a Mon Sep 17 00:00:00 2001 From: xyctruth <398041993@qq.com> Date: Fri, 24 Jun 2022 11:29:48 +0800 Subject: [PATCH] tcc rollback_reson --- dtmcli/dtmimp/trans_base.go | 1 + dtmcli/tcc.go | 1 + dtmgrpc/dtmgpb/dtmgimp.proto | 1 + dtmgrpc/tcc.go | 1 + dtmsvr/api.go | 2 +- test/tcc_test.go | 1 + 6 files changed, 6 insertions(+), 1 deletion(-) diff --git a/dtmcli/dtmimp/trans_base.go b/dtmcli/dtmimp/trans_base.go index 876bf55..cd77910 100644 --- a/dtmcli/dtmimp/trans_base.go +++ b/dtmcli/dtmimp/trans_base.go @@ -50,6 +50,7 @@ type TransOptions struct { PassthroughHeaders []string `json:"passthrough_headers,omitempty" gorm:"-"` // for inherit the specified gin context headers BranchHeaders map[string]string `json:"branch_headers,omitempty" gorm:"-"` // custom branch headers, dtm server => service api Concurrent bool `json:"concurrent" gorm:"-"` // for trans type: saga msg + RollbackReason string `json:"rollback_reason,omitempty" gorm:"-"` } // TransBase base for all trans diff --git a/dtmcli/tcc.go b/dtmcli/tcc.go index 1451427..6c2d191 100644 --- a/dtmcli/tcc.go +++ b/dtmcli/tcc.go @@ -41,6 +41,7 @@ func TccGlobalTransaction2(dtm string, gid string, custom func(*Tcc), tccFunc Tc defer dtmimp.DeferDo(&rerr, func() error { return dtmimp.TransCallDtm(&tcc.TransBase, tcc, "submit") }, func() error { + tcc.RollbackReason = rerr.Error() return dtmimp.TransCallDtm(&tcc.TransBase, tcc, "abort") }) _, rerr = tccFunc(tcc) diff --git a/dtmgrpc/dtmgpb/dtmgimp.proto b/dtmgrpc/dtmgpb/dtmgimp.proto index 0a76d53..8aedea2 100644 --- a/dtmgrpc/dtmgpb/dtmgimp.proto +++ b/dtmgrpc/dtmgpb/dtmgimp.proto @@ -21,6 +21,7 @@ message DtmTransOptions { repeated string PassthroughHeaders = 4; map BranchHeaders = 5; int64 RequestTimeout = 6; + string RollbackReason = 7; } // DtmRequest request sent to dtm server diff --git a/dtmgrpc/tcc.go b/dtmgrpc/tcc.go index 24a2f6a..d9d52a4 100644 --- a/dtmgrpc/tcc.go +++ b/dtmgrpc/tcc.go @@ -43,6 +43,7 @@ func TccGlobalTransaction2(dtm string, gid string, custom func(*TccGrpc), tccFun defer dtmimp.DeferDo(&rerr, func() error { return dtmgimp.DtmGrpcCall(&tcc.TransBase, "Submit") }, func() error { + tcc.RollbackReason = rerr.Error() return dtmgimp.DtmGrpcCall(&tcc.TransBase, "Abort") }) return tccFunc(tcc) diff --git a/dtmsvr/api.go b/dtmsvr/api.go index 831884a..b90e8ad 100644 --- a/dtmsvr/api.go +++ b/dtmsvr/api.go @@ -56,7 +56,7 @@ func svcAbort(t *TransGlobal) interface{} { if t.TransType != "xa" && t.TransType != "tcc" || dbt.Status != dtmcli.StatusPrepared && dbt.Status != dtmcli.StatusAborting { return fmt.Errorf("trans type: '%s' current status '%s', cannot abort. %w", dbt.TransType, dbt.Status, dtmcli.ErrFailure) } - dbt.changeStatus(dtmcli.StatusAborting) + dbt.changeStatus(dtmcli.StatusAborting, withRollbackReason(t.RollbackReason)) branches := GetStore().FindBranches(t.Gid) return dbt.Process(branches) } diff --git a/test/tcc_test.go b/test/tcc_test.go index f4f229d..8297afa 100644 --- a/test/tcc_test.go +++ b/test/tcc_test.go @@ -46,6 +46,7 @@ func TestTccRollback(t *testing.T) { cronTransOnce(t, gid) assert.Equal(t, StatusFailed, getTransStatus(gid)) assert.Equal(t, []string{StatusSucceed, StatusPrepared, StatusSucceed, StatusPrepared}, getBranchesStatus(gid)) + assert.Equal(t, "{\"error\":\"reason:. FAILURE\"}. FAILURE", getTrans(gid).RollbackReason) } func TestTccTimeout(t *testing.T) {