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] 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) {