From 9e5cb99d135bc876dd8b638625c21ab852d78cff Mon Sep 17 00:00:00 2001 From: xyctruth <398041993@qq.com> Date: Wed, 22 Jun 2022 16:26:31 +0800 Subject: [PATCH 1/7] saga add RollbackReason --- dtmsvr/trans_type_saga.go | 9 ++++++--- test/saga_options_test.go | 2 ++ test/saga_test.go | 5 +++++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/dtmsvr/trans_type_saga.go b/dtmsvr/trans_type_saga.go index 2009ae4..31d082c 100644 --- a/dtmsvr/trans_type_saga.go +++ b/dtmsvr/trans_type_saga.go @@ -55,7 +55,7 @@ func (t *transSagaProcessor) ProcessOnce(branches []TransBranch) error { // when saga tasks is fetched, it always need to process logger.Debugf("status: %s timeout: %t", t.Status, t.isTimeout()) if t.Status == dtmcli.StatusSubmitted && t.isTimeout() { - t.changeStatus(dtmcli.StatusAborting) + t.changeStatus(dtmcli.StatusAborting, withRollbackReason(fmt.Sprintf("Timeout after %d seconds", t.TimeoutToFail))) } n := len(branches) @@ -219,8 +219,11 @@ func (t *transSagaProcessor) ProcessOnce(branches []TransBranch) error { t.changeStatus(dtmcli.StatusSucceed) return nil } - if t.Status == dtmcli.StatusSubmitted && (rsAFailed > 0 || t.isTimeout()) { - t.changeStatus(dtmcli.StatusAborting) + if t.Status == dtmcli.StatusSubmitted && rsAFailed > 0 { + t.changeStatus(dtmcli.StatusAborting, withRollbackReason("Transaction branch execution failed")) + } + if t.Status == dtmcli.StatusSubmitted && t.isTimeout() { + t.changeStatus(dtmcli.StatusAborting, withRollbackReason(fmt.Sprintf("Timeout after %d seconds", t.TimeoutToFail))) } if t.Status == dtmcli.StatusAborting { prepareToCompensate() diff --git a/test/saga_options_test.go b/test/saga_options_test.go index 6134ee7..557ab1d 100644 --- a/test/saga_options_test.go +++ b/test/saga_options_test.go @@ -56,6 +56,8 @@ func TestSagaOptionsTimeout(t *testing.T) { cronTransOnceForwardNow(t, gid, 3600) assert.Equal(t, StatusFailed, getTransStatus(saga.Gid)) assert.Equal(t, []string{StatusSucceed, StatusPrepared, StatusPrepared, StatusPrepared}, getBranchesStatus(saga.Gid)) + assert.Regexp(t, `^Timeout after \d+ seconds$`, getTrans(gid).RollbackReason) + } func TestSagaGlobalTransWithRequestTimeout(t *testing.T) { diff --git a/test/saga_test.go b/test/saga_test.go index d7b9ad7..56409a1 100644 --- a/test/saga_test.go +++ b/test/saga_test.go @@ -22,6 +22,7 @@ func TestSagaNormal(t *testing.T) { waitTransProcessed(saga.Gid) assert.Equal(t, []string{StatusPrepared, StatusSucceed, StatusPrepared, StatusSucceed}, getBranchesStatus(saga.Gid)) assert.Equal(t, StatusSucceed, getTransStatus(saga.Gid)) + assert.Equal(t, "", getTrans(saga.Gid).RollbackReason) } func TestSagaRollback(t *testing.T) { @@ -31,6 +32,7 @@ func TestSagaRollback(t *testing.T) { waitTransProcessed(saga.Gid) assert.Equal(t, []string{StatusSucceed, StatusSucceed, StatusSucceed, StatusFailed}, getBranchesStatus(saga.Gid)) assert.Equal(t, StatusFailed, getTransStatus(saga.Gid)) + assert.Equal(t, "Transaction branch execution failed", getTrans(saga.Gid).RollbackReason) } func TestSagaOngoingSucceed(t *testing.T) { @@ -44,6 +46,7 @@ func TestSagaOngoingSucceed(t *testing.T) { cronTransOnce(t, gid) assert.Equal(t, []string{StatusPrepared, StatusSucceed, StatusPrepared, StatusSucceed}, getBranchesStatus(saga.Gid)) assert.Equal(t, StatusSucceed, getTransStatus(saga.Gid)) + assert.Equal(t, "", getTrans(saga.Gid).RollbackReason) } func TestSagaFailed(t *testing.T) { @@ -54,9 +57,11 @@ func TestSagaFailed(t *testing.T) { assert.Nil(t, err) waitTransProcessed(saga.Gid) assert.Equal(t, StatusAborting, getTransStatus(saga.Gid)) + assert.Equal(t, "Transaction branch execution failed", getTrans(saga.Gid).RollbackReason) cronTransOnce(t, gid) assert.Equal(t, StatusFailed, getTransStatus(saga.Gid)) assert.Equal(t, []string{StatusSucceed, StatusSucceed, StatusSucceed, StatusFailed}, getBranchesStatus(saga.Gid)) + assert.Equal(t, "Transaction branch execution failed", getTrans(saga.Gid).RollbackReason) } func TestSagaAbnormal(t *testing.T) { From 47c2abcb757bdef483dd7d9d8b00811152a257b9 Mon Sep 17 00:00:00 2001 From: xyctruth <398041993@qq.com> Date: Wed, 22 Jun 2022 18:50:47 +0800 Subject: [PATCH 2/7] saga http failed rollback reason --- dtmsvr/storage/trans.go | 17 +++++++++-------- dtmsvr/trans_status.go | 1 + dtmsvr/trans_type_saga.go | 15 +++++++++------ test/saga_test.go | 3 ++- test/types.go | 2 +- 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/dtmsvr/storage/trans.go b/dtmsvr/storage/trans.go index 749eb1a..ee64312 100644 --- a/dtmsvr/storage/trans.go +++ b/dtmsvr/storage/trans.go @@ -55,14 +55,15 @@ func (g *TransGlobalStore) String() string { // TransBranchStore branch transaction type TransBranchStore struct { dtmutil.ModelBase - Gid string `json:"gid,omitempty"` - URL string `json:"url,omitempty"` - BinData []byte - BranchID string `json:"branch_id,omitempty"` - Op string `json:"op,omitempty"` - Status string `json:"status,omitempty"` - FinishTime *time.Time `json:"finish_time,omitempty"` - RollbackTime *time.Time `json:"rollback_time,omitempty"` + Gid string `json:"gid,omitempty"` + URL string `json:"url,omitempty"` + BinData []byte + BranchID string `json:"branch_id,omitempty"` + Op string `json:"op,omitempty"` + Status string `json:"status,omitempty"` + FinishTime *time.Time `json:"finish_time,omitempty"` + RollbackTime *time.Time `json:"rollback_time,omitempty"` + RollbackReason string `json:"-" gorm:"-"` } // TableName TableName diff --git a/dtmsvr/trans_status.go b/dtmsvr/trans_status.go index a9d497b..750c095 100644 --- a/dtmsvr/trans_status.go +++ b/dtmsvr/trans_status.go @@ -190,6 +190,7 @@ func (t *TransGlobal) getBranchResult(branch *TransBranch) (string, error) { if err == nil { return dtmcli.StatusSucceed, nil } else if t.TransType == "saga" && branch.Op == dtmimp.OpAction && errors.Is(err, dtmcli.ErrFailure) { + branch.RollbackReason = fmt.Sprintf("url:%s return failed: %s", branch.URL, err.Error()) return dtmcli.StatusFailed, nil } else if errors.Is(err, dtmcli.ErrOngoing) { return "", dtmcli.ErrOngoing diff --git a/dtmsvr/trans_type_saga.go b/dtmsvr/trans_type_saga.go index 31d082c..359bc7b 100644 --- a/dtmsvr/trans_type_saga.go +++ b/dtmsvr/trans_type_saga.go @@ -45,10 +45,11 @@ type cSagaCustom struct { } type branchResult struct { - index int - status string - started bool - op string + index int + status string + started bool + op string + rollbackReason string } func (t *transSagaProcessor) ProcessOnce(branches []TransBranch) error { @@ -73,6 +74,7 @@ func (t *transSagaProcessor) ProcessOnce(branches []TransBranch) error { } // resultStats var rsAToStart, rsAStarted, rsADone, rsAFailed, rsASucceed, rsCToStart, rsCDone, rsCSucceed int + var rollbackReason string branchResults := make([]branchResult, n) // save the branch result for i := 0; i < n; i++ { b := branches[i] @@ -125,7 +127,7 @@ func (t *transSagaProcessor) ProcessOnce(branches []TransBranch) error { if x := recover(); x != nil { err = dtmimp.AsError(x) } - resultChan <- branchResult{index: i, status: branches[i].Status, op: branches[i].Op} + resultChan <- branchResult{index: i, status: branches[i].Status, op: branches[i].Op, rollbackReason: branches[i].RollbackReason} if err != nil && !errors.Is(err, dtmcli.ErrOngoing) { logger.Errorf("exec branch %s %s %s error: %v", branches[i].BranchID, branches[i].Op, branches[i].URL, err) } @@ -172,6 +174,7 @@ func (t *transSagaProcessor) ProcessOnce(branches []TransBranch) error { rsADone++ if r.status == dtmcli.StatusFailed { rsAFailed++ + rollbackReason = r.rollbackReason } else if r.status == dtmcli.StatusSucceed { rsASucceed++ } @@ -220,7 +223,7 @@ func (t *transSagaProcessor) ProcessOnce(branches []TransBranch) error { return nil } if t.Status == dtmcli.StatusSubmitted && rsAFailed > 0 { - t.changeStatus(dtmcli.StatusAborting, withRollbackReason("Transaction branch execution failed")) + t.changeStatus(dtmcli.StatusAborting, withRollbackReason(rollbackReason)) } if t.Status == dtmcli.StatusSubmitted && t.isTimeout() { t.changeStatus(dtmcli.StatusAborting, withRollbackReason(fmt.Sprintf("Timeout after %d seconds", t.TimeoutToFail))) diff --git a/test/saga_test.go b/test/saga_test.go index 56409a1..564c4a4 100644 --- a/test/saga_test.go +++ b/test/saga_test.go @@ -27,12 +27,13 @@ func TestSagaNormal(t *testing.T) { func TestSagaRollback(t *testing.T) { saga := genSaga(dtmimp.GetFuncName(), false, true) + saga.Concurrent = false err := saga.Submit() assert.Nil(t, err) waitTransProcessed(saga.Gid) assert.Equal(t, []string{StatusSucceed, StatusSucceed, StatusSucceed, StatusFailed}, getBranchesStatus(saga.Gid)) assert.Equal(t, StatusFailed, getTransStatus(saga.Gid)) - assert.Equal(t, "Transaction branch execution failed", getTrans(saga.Gid).RollbackReason) + assert.Equal(t, "url:http://localhost:8081/api/busi/TransIn return failed: {\"error\":\"FAILURE\"}. FAILURE", getTrans(saga.Gid).RollbackReason) } func TestSagaOngoingSucceed(t *testing.T) { diff --git a/test/types.go b/test/types.go index 0f3ed43..3193f53 100644 --- a/test/types.go +++ b/test/types.go @@ -33,7 +33,7 @@ func waitTransProcessed(gid string) { case id := <-dtmsvr.TransProcessedTestChan: logger.FatalfIf(id != gid, "------- expecting: %s but %s found", gid, id) logger.Debugf("finish for gid %s", gid) - case <-time.After(time.Duration(time.Second * 4)): + case <-time.After(time.Duration(time.Second * 10000)): logger.FatalfIf(true, "Wait Trans timeout") } } From 95ef160a45ca7279ab7701dea971ad75f072f12f Mon Sep 17 00:00:00 2001 From: xyctruth <398041993@qq.com> Date: Wed, 22 Jun 2022 18:53:01 +0800 Subject: [PATCH 3/7] saga http failed rollback reason --- test/saga_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/saga_test.go b/test/saga_test.go index 564c4a4..38f2bf7 100644 --- a/test/saga_test.go +++ b/test/saga_test.go @@ -58,11 +58,10 @@ func TestSagaFailed(t *testing.T) { assert.Nil(t, err) waitTransProcessed(saga.Gid) assert.Equal(t, StatusAborting, getTransStatus(saga.Gid)) - assert.Equal(t, "Transaction branch execution failed", getTrans(saga.Gid).RollbackReason) cronTransOnce(t, gid) assert.Equal(t, StatusFailed, getTransStatus(saga.Gid)) assert.Equal(t, []string{StatusSucceed, StatusSucceed, StatusSucceed, StatusFailed}, getBranchesStatus(saga.Gid)) - assert.Equal(t, "Transaction branch execution failed", getTrans(saga.Gid).RollbackReason) + assert.Equal(t, "url:http://localhost:8081/api/busi/TransIn return failed: {\"error\":\"FAILURE\"}. FAILURE", getTrans(saga.Gid).RollbackReason) } func TestSagaAbnormal(t *testing.T) { From 707b07cf12fa316cb33d5dd16e10081745fa6cae Mon Sep 17 00:00:00 2001 From: xyctruth <398041993@qq.com> Date: Thu, 23 Jun 2022 10:53:09 +0800 Subject: [PATCH 4/7] saga http failed rollback reason --- dtmsvr/storage/trans.go | 18 +++++++++--------- dtmsvr/trans_status.go | 2 +- dtmsvr/trans_type_saga.go | 18 +++++++++--------- test/busi/base_types.go | 1 + test/busi/busi.go | 6 ++++++ test/saga_test.go | 5 ++--- 6 files changed, 28 insertions(+), 22 deletions(-) diff --git a/dtmsvr/storage/trans.go b/dtmsvr/storage/trans.go index ee64312..f6f1a47 100644 --- a/dtmsvr/storage/trans.go +++ b/dtmsvr/storage/trans.go @@ -55,15 +55,15 @@ func (g *TransGlobalStore) String() string { // TransBranchStore branch transaction type TransBranchStore struct { dtmutil.ModelBase - Gid string `json:"gid,omitempty"` - URL string `json:"url,omitempty"` - BinData []byte - BranchID string `json:"branch_id,omitempty"` - Op string `json:"op,omitempty"` - Status string `json:"status,omitempty"` - FinishTime *time.Time `json:"finish_time,omitempty"` - RollbackTime *time.Time `json:"rollback_time,omitempty"` - RollbackReason string `json:"-" gorm:"-"` + Gid string `json:"gid,omitempty"` + URL string `json:"url,omitempty"` + BinData []byte + BranchID string `json:"branch_id,omitempty"` + Op string `json:"op,omitempty"` + Status string `json:"status,omitempty"` + FinishTime *time.Time `json:"finish_time,omitempty"` + RollbackTime *time.Time `json:"rollback_time,omitempty"` + Error error `json:"-" gorm:"-"` } // TableName TableName diff --git a/dtmsvr/trans_status.go b/dtmsvr/trans_status.go index 750c095..fa1e51e 100644 --- a/dtmsvr/trans_status.go +++ b/dtmsvr/trans_status.go @@ -190,7 +190,7 @@ func (t *TransGlobal) getBranchResult(branch *TransBranch) (string, error) { if err == nil { return dtmcli.StatusSucceed, nil } else if t.TransType == "saga" && branch.Op == dtmimp.OpAction && errors.Is(err, dtmcli.ErrFailure) { - branch.RollbackReason = fmt.Sprintf("url:%s return failed: %s", branch.URL, err.Error()) + branch.Error = fmt.Errorf("url:%s return failed: %w", branch.URL, err) return dtmcli.StatusFailed, nil } else if errors.Is(err, dtmcli.ErrOngoing) { return "", dtmcli.ErrOngoing diff --git a/dtmsvr/trans_type_saga.go b/dtmsvr/trans_type_saga.go index 359bc7b..9117515 100644 --- a/dtmsvr/trans_type_saga.go +++ b/dtmsvr/trans_type_saga.go @@ -45,11 +45,11 @@ type cSagaCustom struct { } type branchResult struct { - index int - status string - started bool - op string - rollbackReason string + index int + status string + started bool + op string + err error } func (t *transSagaProcessor) ProcessOnce(branches []TransBranch) error { @@ -74,7 +74,7 @@ func (t *transSagaProcessor) ProcessOnce(branches []TransBranch) error { } // resultStats var rsAToStart, rsAStarted, rsADone, rsAFailed, rsASucceed, rsCToStart, rsCDone, rsCSucceed int - var rollbackReason string + var failureError error branchResults := make([]branchResult, n) // save the branch result for i := 0; i < n; i++ { b := branches[i] @@ -127,7 +127,7 @@ func (t *transSagaProcessor) ProcessOnce(branches []TransBranch) error { if x := recover(); x != nil { err = dtmimp.AsError(x) } - resultChan <- branchResult{index: i, status: branches[i].Status, op: branches[i].Op, rollbackReason: branches[i].RollbackReason} + resultChan <- branchResult{index: i, status: branches[i].Status, op: branches[i].Op, err: branches[i].Error} if err != nil && !errors.Is(err, dtmcli.ErrOngoing) { logger.Errorf("exec branch %s %s %s error: %v", branches[i].BranchID, branches[i].Op, branches[i].URL, err) } @@ -174,7 +174,7 @@ func (t *transSagaProcessor) ProcessOnce(branches []TransBranch) error { rsADone++ if r.status == dtmcli.StatusFailed { rsAFailed++ - rollbackReason = r.rollbackReason + failureError = r.err } else if r.status == dtmcli.StatusSucceed { rsASucceed++ } @@ -223,7 +223,7 @@ func (t *transSagaProcessor) ProcessOnce(branches []TransBranch) error { return nil } if t.Status == dtmcli.StatusSubmitted && rsAFailed > 0 { - t.changeStatus(dtmcli.StatusAborting, withRollbackReason(rollbackReason)) + t.changeStatus(dtmcli.StatusAborting, withRollbackReason(failureError.Error())) } if t.Status == dtmcli.StatusSubmitted && t.isTimeout() { t.changeStatus(dtmcli.StatusAborting, withRollbackReason(fmt.Sprintf("Timeout after %d seconds", t.TimeoutToFail))) diff --git a/test/busi/base_types.go b/test/busi/base_types.go index 541c2cb..0d4171d 100644 --- a/test/busi/base_types.go +++ b/test/busi/base_types.go @@ -142,6 +142,7 @@ type mainSwitchType struct { QueryPreparedResult AutoEmptyString NextResult AutoEmptyString JrpcResult AutoEmptyString + FailureReason AutoEmptyString } // MainSwitch controls busi success or fail diff --git a/test/busi/busi.go b/test/busi/busi.go index 7d24985..93e8e29 100644 --- a/test/busi/busi.go +++ b/test/busi/busi.go @@ -48,6 +48,12 @@ func handleGeneralBusiness(c *gin.Context, result1 string, result2 string, busi if res == "ERROR" { return errors.New("ERROR from user") } + if res == dtmimp.ResultFailure { + failureReason := MainSwitch.FailureReason.Fetch() + if failureReason != "" { + return fmt.Errorf("%s. %w", failureReason, dtmimp.ErrFailure) + } + } return dtmcli.String2DtmError(res) } diff --git a/test/saga_test.go b/test/saga_test.go index 38f2bf7..aa8c791 100644 --- a/test/saga_test.go +++ b/test/saga_test.go @@ -27,13 +27,13 @@ func TestSagaNormal(t *testing.T) { func TestSagaRollback(t *testing.T) { saga := genSaga(dtmimp.GetFuncName(), false, true) - saga.Concurrent = false + busi.MainSwitch.FailureReason.SetOnce("Insufficient balance") err := saga.Submit() assert.Nil(t, err) waitTransProcessed(saga.Gid) assert.Equal(t, []string{StatusSucceed, StatusSucceed, StatusSucceed, StatusFailed}, getBranchesStatus(saga.Gid)) assert.Equal(t, StatusFailed, getTransStatus(saga.Gid)) - assert.Equal(t, "url:http://localhost:8081/api/busi/TransIn return failed: {\"error\":\"FAILURE\"}. FAILURE", getTrans(saga.Gid).RollbackReason) + assert.Equal(t, "url:http://localhost:8081/api/busi/TransIn return failed: {\"error\":\"Insufficient balance. FAILURE\"}. FAILURE", getTrans(saga.Gid).RollbackReason) } func TestSagaOngoingSucceed(t *testing.T) { @@ -61,7 +61,6 @@ func TestSagaFailed(t *testing.T) { cronTransOnce(t, gid) assert.Equal(t, StatusFailed, getTransStatus(saga.Gid)) assert.Equal(t, []string{StatusSucceed, StatusSucceed, StatusSucceed, StatusFailed}, getBranchesStatus(saga.Gid)) - assert.Equal(t, "url:http://localhost:8081/api/busi/TransIn return failed: {\"error\":\"FAILURE\"}. FAILURE", getTrans(saga.Gid).RollbackReason) } func TestSagaAbnormal(t *testing.T) { From 774c96ecee86822cf52fd30ce5968b08ee5c707e Mon Sep 17 00:00:00 2001 From: xyctruth <398041993@qq.com> Date: Thu, 23 Jun 2022 11:29:03 +0800 Subject: [PATCH 5/7] fix some --- test/busi/busi.go | 5 +---- test/saga_test.go | 2 +- test/types.go | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/test/busi/busi.go b/test/busi/busi.go index 93e8e29..6749783 100644 --- a/test/busi/busi.go +++ b/test/busi/busi.go @@ -49,10 +49,7 @@ func handleGeneralBusiness(c *gin.Context, result1 string, result2 string, busi return errors.New("ERROR from user") } if res == dtmimp.ResultFailure { - failureReason := MainSwitch.FailureReason.Fetch() - if failureReason != "" { - return fmt.Errorf("%s. %w", failureReason, dtmimp.ErrFailure) - } + return fmt.Errorf("reason:%s. %w", MainSwitch.FailureReason.Fetch(), dtmimp.ErrFailure) } return dtmcli.String2DtmError(res) } diff --git a/test/saga_test.go b/test/saga_test.go index aa8c791..f536a4c 100644 --- a/test/saga_test.go +++ b/test/saga_test.go @@ -33,7 +33,7 @@ func TestSagaRollback(t *testing.T) { waitTransProcessed(saga.Gid) assert.Equal(t, []string{StatusSucceed, StatusSucceed, StatusSucceed, StatusFailed}, getBranchesStatus(saga.Gid)) assert.Equal(t, StatusFailed, getTransStatus(saga.Gid)) - assert.Equal(t, "url:http://localhost:8081/api/busi/TransIn return failed: {\"error\":\"Insufficient balance. FAILURE\"}. FAILURE", getTrans(saga.Gid).RollbackReason) + assert.Equal(t, "url:http://localhost:8081/api/busi/TransIn return failed: {\"error\":\"reason:Insufficient balance. FAILURE\"}. FAILURE", getTrans(saga.Gid).RollbackReason) } func TestSagaOngoingSucceed(t *testing.T) { diff --git a/test/types.go b/test/types.go index 3193f53..0f3ed43 100644 --- a/test/types.go +++ b/test/types.go @@ -33,7 +33,7 @@ func waitTransProcessed(gid string) { case id := <-dtmsvr.TransProcessedTestChan: logger.FatalfIf(id != gid, "------- expecting: %s but %s found", gid, id) logger.Debugf("finish for gid %s", gid) - case <-time.After(time.Duration(time.Second * 10000)): + case <-time.After(time.Duration(time.Second * 4)): logger.FatalfIf(true, "Wait Trans timeout") } } From ef007b046111ea0fead02d4d6e3b666247f60881 Mon Sep 17 00:00:00 2001 From: xyctruth <398041993@qq.com> Date: Thu, 23 Jun 2022 11:59:31 +0800 Subject: [PATCH 6/7] grpc error reason --- dtmgrpc/type.go | 3 ++- test/busi/busi.go | 2 +- test/saga_grpc_test.go | 2 ++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/dtmgrpc/type.go b/dtmgrpc/type.go index f92d830..bce24ba 100644 --- a/dtmgrpc/type.go +++ b/dtmgrpc/type.go @@ -8,6 +8,7 @@ package dtmgrpc import ( context "context" + "fmt" "github.com/dtm-labs/dtm/dtmcli" "github.com/dtm-labs/dtm/dtmcli/dtmimp" @@ -38,7 +39,7 @@ func GrpcError2DtmError(err error) error { if st.Message() == dtmcli.ResultOngoing { return dtmcli.ErrOngoing } - return dtmcli.ErrFailure + return fmt.Errorf("%s. %w", st.Message(), dtmcli.ErrFailure) } else if ok && st.Code() == codes.FailedPrecondition { return dtmcli.ErrOngoing } diff --git a/test/busi/busi.go b/test/busi/busi.go index 6749783..d6b30bc 100644 --- a/test/busi/busi.go +++ b/test/busi/busi.go @@ -34,7 +34,7 @@ func handleGrpcBusiness(in *BusiReq, result1 string, result2 string, busi string if res == dtmcli.ResultSuccess { return nil } else if res == dtmcli.ResultFailure { - return status.New(codes.Aborted, dtmcli.ResultFailure).Err() + return status.New(codes.Aborted, fmt.Sprintf("reason:%s. %s", MainSwitch.FailureReason.Fetch(), dtmimp.ErrFailure)).Err() } else if res == dtmcli.ResultOngoing { return status.New(codes.FailedPrecondition, dtmcli.ResultOngoing).Err() } diff --git a/test/saga_grpc_test.go b/test/saga_grpc_test.go index 94f1732..273dee6 100644 --- a/test/saga_grpc_test.go +++ b/test/saga_grpc_test.go @@ -28,6 +28,7 @@ func TestSagaGrpcNormal(t *testing.T) { func TestSagaGrpcRollback(t *testing.T) { gid := dtmimp.GetFuncName() saga := genSagaGrpc(gid, false, true) + busi.MainSwitch.FailureReason.SetOnce("Insufficient balance") busi.MainSwitch.TransOutRevertResult.SetOnce(dtmcli.ResultOngoing) saga.Submit() waitTransProcessed(saga.Gid) @@ -35,6 +36,7 @@ func TestSagaGrpcRollback(t *testing.T) { cronTransOnce(t, gid) assert.Equal(t, StatusFailed, getTransStatus(saga.Gid)) assert.Equal(t, []string{StatusSucceed, StatusSucceed, StatusSucceed, StatusFailed}, getBranchesStatus(saga.Gid)) + assert.Equal(t, "url:localhost:58081/busi.Busi/TransIn return failed: reason:Insufficient balance. FAILURE. FAILURE", getTrans(saga.Gid).RollbackReason) } func TestSagaGrpcCurrent(t *testing.T) { From 71f4aaa47034f658c54afce5daf849d4750f1553 Mon Sep 17 00:00:00 2001 From: xyctruth <398041993@qq.com> Date: Thu, 23 Jun 2022 11:59:43 +0800 Subject: [PATCH 7/7] grpc error reason --- dtmgrpc/type.go | 1 + test/busi/busi.go | 2 +- test/saga_grpc_test.go | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/dtmgrpc/type.go b/dtmgrpc/type.go index bce24ba..14244e3 100644 --- a/dtmgrpc/type.go +++ b/dtmgrpc/type.go @@ -39,6 +39,7 @@ func GrpcError2DtmError(err error) error { if st.Message() == dtmcli.ResultOngoing { return dtmcli.ErrOngoing } + return fmt.Errorf("%s. %w", st.Message(), dtmcli.ErrFailure) } else if ok && st.Code() == codes.FailedPrecondition { return dtmcli.ErrOngoing diff --git a/test/busi/busi.go b/test/busi/busi.go index d6b30bc..81c9c9e 100644 --- a/test/busi/busi.go +++ b/test/busi/busi.go @@ -34,7 +34,7 @@ func handleGrpcBusiness(in *BusiReq, result1 string, result2 string, busi string if res == dtmcli.ResultSuccess { return nil } else if res == dtmcli.ResultFailure { - return status.New(codes.Aborted, fmt.Sprintf("reason:%s. %s", MainSwitch.FailureReason.Fetch(), dtmimp.ErrFailure)).Err() + return status.New(codes.Aborted, fmt.Sprintf("reason:%s", MainSwitch.FailureReason.Fetch())).Err() } else if res == dtmcli.ResultOngoing { return status.New(codes.FailedPrecondition, dtmcli.ResultOngoing).Err() } diff --git a/test/saga_grpc_test.go b/test/saga_grpc_test.go index 273dee6..9a98d06 100644 --- a/test/saga_grpc_test.go +++ b/test/saga_grpc_test.go @@ -36,7 +36,7 @@ func TestSagaGrpcRollback(t *testing.T) { cronTransOnce(t, gid) assert.Equal(t, StatusFailed, getTransStatus(saga.Gid)) assert.Equal(t, []string{StatusSucceed, StatusSucceed, StatusSucceed, StatusFailed}, getBranchesStatus(saga.Gid)) - assert.Equal(t, "url:localhost:58081/busi.Busi/TransIn return failed: reason:Insufficient balance. FAILURE. FAILURE", getTrans(saga.Gid).RollbackReason) + assert.Equal(t, "url:localhost:58081/busi.Busi/TransIn return failed: reason:Insufficient balance. FAILURE", getTrans(saga.Gid).RollbackReason) } func TestSagaGrpcCurrent(t *testing.T) {