fix commit and rollback codec bug #14tags/v0.1.0-rc1
| @@ -14,6 +14,7 @@ require ( | |||||
| github.com/stretchr/testify v1.7.0 | github.com/stretchr/testify v1.7.0 | ||||
| go.uber.org/atomic v1.9.0 | go.uber.org/atomic v1.9.0 | ||||
| go.uber.org/zap v1.19.1 | go.uber.org/zap v1.19.1 | ||||
| golang.org/x/tools v0.1.11 // indirect | |||||
| gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect | ||||
| gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect | gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect | ||||
| vimagination.zapto.org/byteio v0.0.0-20200222190125-d27cba0f0b10 | vimagination.zapto.org/byteio v0.0.0-20200222190125-d27cba0f0b10 | ||||
| @@ -18,7 +18,10 @@ | |||||
| package codec | package codec | ||||
| import ( | import ( | ||||
| "math" | |||||
| "github.com/seata/seata-go/pkg/common/bytes" | "github.com/seata/seata-go/pkg/common/bytes" | ||||
| serror "github.com/seata/seata-go/pkg/common/error" | |||||
| "github.com/seata/seata-go/pkg/protocol/branch" | "github.com/seata/seata-go/pkg/protocol/branch" | ||||
| "github.com/seata/seata-go/pkg/protocol/message" | "github.com/seata/seata-go/pkg/protocol/message" | ||||
| ) | ) | ||||
| @@ -31,23 +34,37 @@ type BranchCommitResponseCodec struct { | |||||
| } | } | ||||
| func (g *BranchCommitResponseCodec) Decode(in []byte) interface{} { | func (g *BranchCommitResponseCodec) Decode(in []byte) interface{} { | ||||
| res := message.BranchCommitResponse{} | |||||
| data := message.BranchCommitResponse{} | |||||
| buf := bytes.NewByteBuffer(in) | buf := bytes.NewByteBuffer(in) | ||||
| res.Xid = bytes.ReadString16Length(buf) | |||||
| res.BranchId = int64(bytes.ReadUInt64(buf)) | |||||
| res.BranchStatus = branch.BranchStatus(bytes.ReadByte(buf)) | |||||
| data.ResultCode = message.ResultCode(bytes.ReadByte(buf)) | |||||
| if data.ResultCode == message.ResultCodeFailed { | |||||
| data.Msg = bytes.ReadString16Length(buf) | |||||
| } | |||||
| data.TransactionExceptionCode = serror.TransactionExceptionCode(bytes.ReadByte(buf)) | |||||
| data.Xid = bytes.ReadString16Length(buf) | |||||
| data.BranchId = int64(bytes.ReadUInt64(buf)) | |||||
| data.BranchStatus = branch.BranchStatus(bytes.ReadByte(buf)) | |||||
| return res | |||||
| return data | |||||
| } | } | ||||
| func (g *BranchCommitResponseCodec) Encode(in interface{}) []byte { | func (g *BranchCommitResponseCodec) Encode(in interface{}) []byte { | ||||
| req, _ := in.(message.BranchCommitResponse) | |||||
| data, _ := in.(message.BranchCommitResponse) | |||||
| buf := bytes.NewByteBuffer([]byte{}) | buf := bytes.NewByteBuffer([]byte{}) | ||||
| bytes.WriteString16Length(req.Xid, buf) | |||||
| buf.WriteInt64(req.BranchId) | |||||
| buf.WriteByte(byte(req.BranchStatus)) | |||||
| buf.WriteByte(byte(data.ResultCode)) | |||||
| if data.ResultCode == message.ResultCodeFailed { | |||||
| msg := data.Msg | |||||
| if len(data.Msg) > math.MaxInt16 { | |||||
| msg = data.Msg[:math.MaxInt16] | |||||
| } | |||||
| bytes.WriteString16Length(msg, buf) | |||||
| } | |||||
| buf.WriteByte(byte(data.TransactionExceptionCode)) | |||||
| bytes.WriteString16Length(data.Xid, buf) | |||||
| buf.WriteInt64(data.BranchId) | |||||
| buf.WriteByte(byte(data.BranchStatus)) | |||||
| return buf.Bytes() | return buf.Bytes() | ||||
| } | } | ||||
| @@ -20,6 +20,8 @@ package codec | |||||
| import ( | import ( | ||||
| "testing" | "testing" | ||||
| serror "github.com/seata/seata-go/pkg/common/error" | |||||
| model2 "github.com/seata/seata-go/pkg/protocol/branch" | model2 "github.com/seata/seata-go/pkg/protocol/branch" | ||||
| "github.com/seata/seata-go/pkg/protocol/message" | "github.com/seata/seata-go/pkg/protocol/message" | ||||
| @@ -32,6 +34,13 @@ func TestBranchCommitResponseCodec(t *testing.T) { | |||||
| Xid: "123344", | Xid: "123344", | ||||
| BranchId: 56678, | BranchId: 56678, | ||||
| BranchStatus: model2.BranchStatusPhaseoneFailed, | BranchStatus: model2.BranchStatusPhaseoneFailed, | ||||
| AbstractTransactionResponse: message.AbstractTransactionResponse{ | |||||
| TransactionExceptionCode: serror.TransactionExceptionCodeBeginFailed, | |||||
| AbstractResultMessage: message.AbstractResultMessage{ | |||||
| ResultCode: message.ResultCodeFailed, | |||||
| Msg: "FAILED", | |||||
| }, | |||||
| }, | |||||
| }, | }, | ||||
| } | } | ||||
| @@ -18,8 +18,10 @@ | |||||
| package codec | package codec | ||||
| import ( | import ( | ||||
| "math" | |||||
| "github.com/seata/seata-go/pkg/common/bytes" | "github.com/seata/seata-go/pkg/common/bytes" | ||||
| error2 "github.com/seata/seata-go/pkg/common/error" | |||||
| serror "github.com/seata/seata-go/pkg/common/error" | |||||
| "github.com/seata/seata-go/pkg/protocol/message" | "github.com/seata/seata-go/pkg/protocol/message" | ||||
| ) | ) | ||||
| @@ -38,7 +40,7 @@ func (g *BranchRegisterResponseCodec) Decode(in []byte) interface{} { | |||||
| if data.ResultCode == message.ResultCodeFailed { | if data.ResultCode == message.ResultCodeFailed { | ||||
| data.Msg = bytes.ReadString16Length(buf) | data.Msg = bytes.ReadString16Length(buf) | ||||
| } | } | ||||
| data.TransactionExceptionCode = error2.TransactionExceptionCode(bytes.ReadByte(buf)) | |||||
| data.TransactionExceptionCode = serror.TransactionExceptionCode(bytes.ReadByte(buf)) | |||||
| data.BranchId = int64(bytes.ReadUInt64(buf)) | data.BranchId = int64(bytes.ReadUInt64(buf)) | ||||
| return data | return data | ||||
| @@ -50,11 +52,9 @@ func (c *BranchRegisterResponseCodec) Encode(in interface{}) []byte { | |||||
| buf.WriteByte(byte(data.ResultCode)) | buf.WriteByte(byte(data.ResultCode)) | ||||
| if data.ResultCode == message.ResultCodeFailed { | if data.ResultCode == message.ResultCodeFailed { | ||||
| var msg string | |||||
| if len(data.Msg) > 128 { | |||||
| msg = data.Msg[:128] | |||||
| } else { | |||||
| msg = data.Msg | |||||
| msg := data.Msg | |||||
| if len(data.Msg) > math.MaxInt16 { | |||||
| msg = data.Msg[:math.MaxInt16] | |||||
| } | } | ||||
| bytes.WriteString16Length(msg, buf) | bytes.WriteString16Length(msg, buf) | ||||
| } | } | ||||
| @@ -20,7 +20,7 @@ package codec | |||||
| import ( | import ( | ||||
| "testing" | "testing" | ||||
| error2 "github.com/seata/seata-go/pkg/common/error" | |||||
| serror "github.com/seata/seata-go/pkg/common/error" | |||||
| "github.com/seata/seata-go/pkg/protocol/message" | "github.com/seata/seata-go/pkg/protocol/message" | ||||
| "github.com/stretchr/testify/assert" | "github.com/stretchr/testify/assert" | ||||
| @@ -33,7 +33,7 @@ func TestBranchRegisterResponseCodec(t *testing.T) { | |||||
| ResultCode: message.ResultCodeFailed, | ResultCode: message.ResultCodeFailed, | ||||
| Msg: "FAILED", | Msg: "FAILED", | ||||
| }, | }, | ||||
| TransactionExceptionCode: error2.TransactionExceptionCodeUnknown, | |||||
| TransactionExceptionCode: serror.TransactionExceptionCodeUnknown, | |||||
| }, | }, | ||||
| BranchId: 124356567, | BranchId: 124356567, | ||||
| } | } | ||||
| @@ -18,7 +18,10 @@ | |||||
| package codec | package codec | ||||
| import ( | import ( | ||||
| "math" | |||||
| "github.com/seata/seata-go/pkg/common/bytes" | "github.com/seata/seata-go/pkg/common/bytes" | ||||
| serror "github.com/seata/seata-go/pkg/common/error" | |||||
| "github.com/seata/seata-go/pkg/protocol/branch" | "github.com/seata/seata-go/pkg/protocol/branch" | ||||
| "github.com/seata/seata-go/pkg/protocol/message" | "github.com/seata/seata-go/pkg/protocol/message" | ||||
| ) | ) | ||||
| @@ -34,6 +37,11 @@ func (g *BranchRollbackResponseCodec) Decode(in []byte) interface{} { | |||||
| data := message.BranchRollbackResponse{} | data := message.BranchRollbackResponse{} | ||||
| buf := bytes.NewByteBuffer(in) | buf := bytes.NewByteBuffer(in) | ||||
| data.ResultCode = message.ResultCode(bytes.ReadByte(buf)) | |||||
| if data.ResultCode == message.ResultCodeFailed { | |||||
| data.Msg = bytes.ReadString16Length(buf) | |||||
| } | |||||
| data.TransactionExceptionCode = serror.TransactionExceptionCode(bytes.ReadByte(buf)) | |||||
| data.Xid = bytes.ReadString16Length(buf) | data.Xid = bytes.ReadString16Length(buf) | ||||
| data.BranchId = int64(bytes.ReadUInt64(buf)) | data.BranchId = int64(bytes.ReadUInt64(buf)) | ||||
| data.BranchStatus = branch.BranchStatus(bytes.ReadByte(buf)) | data.BranchStatus = branch.BranchStatus(bytes.ReadByte(buf)) | ||||
| @@ -45,6 +53,15 @@ func (g *BranchRollbackResponseCodec) Encode(in interface{}) []byte { | |||||
| data, _ := in.(message.BranchRollbackResponse) | data, _ := in.(message.BranchRollbackResponse) | ||||
| buf := bytes.NewByteBuffer([]byte{}) | buf := bytes.NewByteBuffer([]byte{}) | ||||
| buf.WriteByte(byte(data.ResultCode)) | |||||
| if data.ResultCode == message.ResultCodeFailed { | |||||
| msg := data.Msg | |||||
| if len(data.Msg) > math.MaxInt16 { | |||||
| msg = data.Msg[:math.MaxInt16] | |||||
| } | |||||
| bytes.WriteString16Length(msg, buf) | |||||
| } | |||||
| buf.WriteByte(byte(data.TransactionExceptionCode)) | |||||
| bytes.WriteString16Length(data.Xid, buf) | bytes.WriteString16Length(data.Xid, buf) | ||||
| buf.WriteInt64(data.BranchId) | buf.WriteInt64(data.BranchId) | ||||
| buf.WriteByte(byte(data.BranchStatus)) | buf.WriteByte(byte(data.BranchStatus)) | ||||
| @@ -20,6 +20,8 @@ package codec | |||||
| import ( | import ( | ||||
| "testing" | "testing" | ||||
| serror "github.com/seata/seata-go/pkg/common/error" | |||||
| model2 "github.com/seata/seata-go/pkg/protocol/branch" | model2 "github.com/seata/seata-go/pkg/protocol/branch" | ||||
| "github.com/seata/seata-go/pkg/protocol/message" | "github.com/seata/seata-go/pkg/protocol/message" | ||||
| @@ -32,6 +34,13 @@ func TestBranchRollbackResponseCodec(t *testing.T) { | |||||
| Xid: "123344", | Xid: "123344", | ||||
| BranchId: 56678, | BranchId: 56678, | ||||
| BranchStatus: model2.BranchStatusPhaseoneFailed, | BranchStatus: model2.BranchStatusPhaseoneFailed, | ||||
| AbstractTransactionResponse: message.AbstractTransactionResponse{ | |||||
| TransactionExceptionCode: serror.TransactionExceptionCodeBeginFailed, | |||||
| AbstractResultMessage: message.AbstractResultMessage{ | |||||
| ResultCode: message.ResultCodeFailed, | |||||
| Msg: "FAILED", | |||||
| }, | |||||
| }, | |||||
| }, | }, | ||||
| } | } | ||||
| @@ -18,8 +18,10 @@ | |||||
| package codec | package codec | ||||
| import ( | import ( | ||||
| "math" | |||||
| "github.com/seata/seata-go/pkg/common/bytes" | "github.com/seata/seata-go/pkg/common/bytes" | ||||
| transaction2 "github.com/seata/seata-go/pkg/common/error" | |||||
| serror "github.com/seata/seata-go/pkg/common/error" | |||||
| "github.com/seata/seata-go/pkg/protocol/message" | "github.com/seata/seata-go/pkg/protocol/message" | ||||
| ) | ) | ||||
| @@ -32,11 +34,9 @@ func (c *CommonGlobalEndResponseCodec) Encode(in interface{}) []byte { | |||||
| buf.WriteByte(byte(data.ResultCode)) | buf.WriteByte(byte(data.ResultCode)) | ||||
| if data.ResultCode == message.ResultCodeFailed { | if data.ResultCode == message.ResultCodeFailed { | ||||
| var msg string | |||||
| if len(data.Msg) > 128 { | |||||
| msg = data.Msg[:128] | |||||
| } else { | |||||
| msg = data.Msg | |||||
| msg := data.Msg | |||||
| if len(data.Msg) > math.MaxInt16 { | |||||
| msg = data.Msg[:math.MaxInt16] | |||||
| } | } | ||||
| bytes.WriteString16Length(msg, buf) | bytes.WriteString16Length(msg, buf) | ||||
| } | } | ||||
| @@ -54,7 +54,7 @@ func (c *CommonGlobalEndResponseCodec) Decode(in []byte) interface{} { | |||||
| if data.ResultCode == message.ResultCodeFailed { | if data.ResultCode == message.ResultCodeFailed { | ||||
| data.Msg = bytes.ReadString16Length(buf) | data.Msg = bytes.ReadString16Length(buf) | ||||
| } | } | ||||
| data.TransactionExceptionCode = transaction2.TransactionExceptionCode(bytes.ReadByte(buf)) | |||||
| data.TransactionExceptionCode = serror.TransactionExceptionCode(bytes.ReadByte(buf)) | |||||
| data.GlobalStatus = message.GlobalStatus(bytes.ReadByte(buf)) | data.GlobalStatus = message.GlobalStatus(bytes.ReadByte(buf)) | ||||
| return data | return data | ||||
| @@ -18,8 +18,10 @@ | |||||
| package codec | package codec | ||||
| import ( | import ( | ||||
| "math" | |||||
| "github.com/seata/seata-go/pkg/common/bytes" | "github.com/seata/seata-go/pkg/common/bytes" | ||||
| error2 "github.com/seata/seata-go/pkg/common/error" | |||||
| serror "github.com/seata/seata-go/pkg/common/error" | |||||
| "github.com/seata/seata-go/pkg/protocol/message" | "github.com/seata/seata-go/pkg/protocol/message" | ||||
| ) | ) | ||||
| @@ -36,11 +38,9 @@ func (c *GlobalBeginResponseCodec) Encode(in interface{}) []byte { | |||||
| buf.WriteByte(byte(data.ResultCode)) | buf.WriteByte(byte(data.ResultCode)) | ||||
| if data.ResultCode == message.ResultCodeFailed { | if data.ResultCode == message.ResultCodeFailed { | ||||
| var msg string | |||||
| if len(data.Msg) > 128 { | |||||
| msg = data.Msg[:128] | |||||
| } else { | |||||
| msg = data.Msg | |||||
| msg := data.Msg | |||||
| if len(data.Msg) > math.MaxInt16 { | |||||
| msg = data.Msg[:math.MaxInt16] | |||||
| } | } | ||||
| bytes.WriteString16Length(msg, buf) | bytes.WriteString16Length(msg, buf) | ||||
| } | } | ||||
| @@ -59,7 +59,7 @@ func (g *GlobalBeginResponseCodec) Decode(in []byte) interface{} { | |||||
| if data.ResultCode == message.ResultCodeFailed { | if data.ResultCode == message.ResultCodeFailed { | ||||
| data.Msg = bytes.ReadString16Length(buf) | data.Msg = bytes.ReadString16Length(buf) | ||||
| } | } | ||||
| data.TransactionExceptionCode = error2.TransactionExceptionCode(bytes.ReadByte(buf)) | |||||
| data.TransactionExceptionCode = serror.TransactionExceptionCode(bytes.ReadByte(buf)) | |||||
| data.Xid = bytes.ReadString16Length(buf) | data.Xid = bytes.ReadString16Length(buf) | ||||
| data.ExtraData = []byte(bytes.ReadString16Length(buf)) | data.ExtraData = []byte(bytes.ReadString16Length(buf)) | ||||
| @@ -20,7 +20,7 @@ package codec | |||||
| import ( | import ( | ||||
| "testing" | "testing" | ||||
| error2 "github.com/seata/seata-go/pkg/common/error" | |||||
| serror "github.com/seata/seata-go/pkg/common/error" | |||||
| "github.com/seata/seata-go/pkg/protocol/message" | "github.com/seata/seata-go/pkg/protocol/message" | ||||
| "github.com/stretchr/testify/assert" | "github.com/stretchr/testify/assert" | ||||
| @@ -33,7 +33,7 @@ func TestGlobalBeginResponseCodec(t *testing.T) { | |||||
| ResultCode: message.ResultCodeFailed, | ResultCode: message.ResultCodeFailed, | ||||
| Msg: "FAILED", | Msg: "FAILED", | ||||
| }, | }, | ||||
| TransactionExceptionCode: error2.TransactionExceptionCodeBeginFailed, | |||||
| TransactionExceptionCode: serror.TransactionExceptionCodeBeginFailed, | |||||
| }, | }, | ||||
| Xid: "test-transaction-id", | Xid: "test-transaction-id", | ||||
| @@ -56,3 +56,7 @@ func (msg HeartBeatMessage) ToString() string { | |||||
| return "services pong" | return "services pong" | ||||
| } | } | ||||
| } | } | ||||
| func (resp HeartBeatMessage) GetTypeCode() MessageType { | |||||
| return MessageType_HeartbeatMsg | |||||
| } | |||||
| @@ -18,13 +18,13 @@ | |||||
| package message | package message | ||||
| import ( | import ( | ||||
| transaction2 "github.com/seata/seata-go/pkg/common/error" | |||||
| serror "github.com/seata/seata-go/pkg/common/error" | |||||
| model2 "github.com/seata/seata-go/pkg/protocol/branch" | model2 "github.com/seata/seata-go/pkg/protocol/branch" | ||||
| ) | ) | ||||
| type AbstractTransactionResponse struct { | type AbstractTransactionResponse struct { | ||||
| AbstractResultMessage | AbstractResultMessage | ||||
| TransactionExceptionCode transaction2.TransactionExceptionCode | |||||
| TransactionExceptionCode serror.TransactionExceptionCode | |||||
| } | } | ||||
| type AbstractBranchEndResponse struct { | type AbstractBranchEndResponse struct { | ||||
| @@ -72,7 +72,7 @@ func (client *GettyRemoting) SendASync(msg message.RpcMessage) error { | |||||
| } | } | ||||
| func (client *GettyRemoting) sendAsync(session getty.Session, msg message.RpcMessage, timeout time.Duration) (interface{}, error) { | func (client *GettyRemoting) sendAsync(session getty.Session, msg message.RpcMessage, timeout time.Duration) (interface{}, error) { | ||||
| log.Infof("send message: {%#v}", msg) | |||||
| log.Infof("send async message: {%#v}", msg) | |||||
| var err error | var err error | ||||
| if session == nil || session.IsClosed() { | if session == nil || session.IsClosed() { | ||||
| log.Warn("sendAsyncRequestWithResponse nothing, caused by null channel.") | log.Warn("sendAsyncRequestWithResponse nothing, caused by null channel.") | ||||
| @@ -68,7 +68,7 @@ func (client *gettyClientHandler) OnOpen(session getty.Session) error { | |||||
| err := GetGettyRemotingClient().SendAsyncRequest(request) | err := GetGettyRemotingClient().SendAsyncRequest(request) | ||||
| //client.sendAsyncRequestWithResponse(session, request, RPC_REQUEST_TIMEOUT) | //client.sendAsyncRequestWithResponse(session, request, RPC_REQUEST_TIMEOUT) | ||||
| if err != nil { | if err != nil { | ||||
| log.Error("OnOpen error: {%#v}", err.Error()) | |||||
| log.Errorf("OnOpen error: {%#v}", err.Error()) | |||||
| sessionManager.ReleaseGettySession(session) | sessionManager.ReleaseGettySession(session) | ||||
| return | return | ||||
| } | } | ||||
| @@ -111,7 +111,7 @@ func (client *gettyClientHandler) OnMessage(session getty.Session, pkg interface | |||||
| } | } | ||||
| func (client *gettyClientHandler) OnCron(session getty.Session) { | func (client *gettyClientHandler) OnCron(session getty.Session) { | ||||
| // todo send heartbeat message | |||||
| GetGettyRemotingClient().SendAsyncRequest(message.HeartBeatMessagePing) | |||||
| } | } | ||||
| func (client *gettyClientHandler) RegisterProcessor(msgType message.MessageType, processor processor.RemotingProcessor) { | func (client *gettyClientHandler) RegisterProcessor(msgType message.MessageType, processor processor.RemotingProcessor) { | ||||
| @@ -32,10 +32,10 @@ func init() { | |||||
| type clientHeartBeatProcesson struct{} | type clientHeartBeatProcesson struct{} | ||||
| func (f *clientHeartBeatProcesson) Process(ctx context.Context, rpcMessage message.RpcMessage) error { | func (f *clientHeartBeatProcesson) Process(ctx context.Context, rpcMessage message.RpcMessage) error { | ||||
| if _, ok := rpcMessage.Body.(message.HeartBeatMessage); ok { | |||||
| // TODO 如何从context中获取远程服务的信息? | |||||
| //log.Infof("received PONG from {}", ctx.channel().remoteAddress()) | |||||
| log.Infof("received PONG from {}", ctx) | |||||
| if msg, ok := rpcMessage.Body.(message.HeartBeatMessage); ok { | |||||
| if !msg.Ping { | |||||
| log.Infof("received PONG from {}", ctx) | |||||
| } | |||||
| } | } | ||||
| return nil | return nil | ||||
| } | } | ||||
| @@ -23,23 +23,23 @@ import ( | |||||
| "github.com/seata/seata-go/pkg/common/log" | "github.com/seata/seata-go/pkg/common/log" | ||||
| "github.com/seata/seata-go/pkg/protocol/message" | "github.com/seata/seata-go/pkg/protocol/message" | ||||
| getty2 "github.com/seata/seata-go/pkg/remoting/getty" | |||||
| "github.com/seata/seata-go/pkg/remoting/getty" | |||||
| ) | ) | ||||
| func init() { | func init() { | ||||
| clientOnResponseProcessor := &clientOnResponseProcessor{} | clientOnResponseProcessor := &clientOnResponseProcessor{} | ||||
| getty2.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_SeataMergeResult, clientOnResponseProcessor) | |||||
| getty2.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_BranchRegisterResult, clientOnResponseProcessor) | |||||
| getty2.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_BranchStatusReportResult, clientOnResponseProcessor) | |||||
| getty2.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_GlobalLockQueryResult, clientOnResponseProcessor) | |||||
| getty2.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_RegRmResult, clientOnResponseProcessor) | |||||
| getty2.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_GlobalBeginResult, clientOnResponseProcessor) | |||||
| getty2.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_GlobalCommitResult, clientOnResponseProcessor) | |||||
| getty.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_SeataMergeResult, clientOnResponseProcessor) | |||||
| getty.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_BranchRegisterResult, clientOnResponseProcessor) | |||||
| getty.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_BranchStatusReportResult, clientOnResponseProcessor) | |||||
| getty.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_GlobalLockQueryResult, clientOnResponseProcessor) | |||||
| getty.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_RegRmResult, clientOnResponseProcessor) | |||||
| getty.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_GlobalBeginResult, clientOnResponseProcessor) | |||||
| getty.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_GlobalCommitResult, clientOnResponseProcessor) | |||||
| getty2.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_GlobalReportResult, clientOnResponseProcessor) | |||||
| getty2.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_GlobalRollbackResult, clientOnResponseProcessor) | |||||
| getty2.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_GlobalStatusResult, clientOnResponseProcessor) | |||||
| getty2.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_RegCltResult, clientOnResponseProcessor) | |||||
| getty.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_GlobalReportResult, clientOnResponseProcessor) | |||||
| getty.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_GlobalRollbackResult, clientOnResponseProcessor) | |||||
| getty.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_GlobalStatusResult, clientOnResponseProcessor) | |||||
| getty.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_RegCltResult, clientOnResponseProcessor) | |||||
| } | } | ||||
| type clientOnResponseProcessor struct { | type clientOnResponseProcessor struct { | ||||
| @@ -48,26 +48,26 @@ type clientOnResponseProcessor struct { | |||||
| func (f *clientOnResponseProcessor) Process(ctx context.Context, rpcMessage message.RpcMessage) error { | func (f *clientOnResponseProcessor) Process(ctx context.Context, rpcMessage message.RpcMessage) error { | ||||
| log.Infof("the rm client received clientOnResponse msg %#v from tc server.", rpcMessage) | log.Infof("the rm client received clientOnResponse msg %#v from tc server.", rpcMessage) | ||||
| if mergedResult, ok := rpcMessage.Body.(message.MergeResultMessage); ok { | if mergedResult, ok := rpcMessage.Body.(message.MergeResultMessage); ok { | ||||
| mergedMessage := getty2.GetGettyRemotingInstance().GetMergedMessage(rpcMessage.ID) | |||||
| mergedMessage := getty.GetGettyRemotingInstance().GetMergedMessage(rpcMessage.ID) | |||||
| if mergedMessage != nil { | if mergedMessage != nil { | ||||
| for i := 0; i < len(mergedMessage.Msgs); i++ { | for i := 0; i < len(mergedMessage.Msgs); i++ { | ||||
| msgID := mergedMessage.MsgIds[i] | msgID := mergedMessage.MsgIds[i] | ||||
| response := getty2.GetGettyRemotingInstance().GetMessageFuture(msgID) | |||||
| response := getty.GetGettyRemotingInstance().GetMessageFuture(msgID) | |||||
| if response != nil { | if response != nil { | ||||
| response.Response = mergedResult.Msgs[i] | response.Response = mergedResult.Msgs[i] | ||||
| response.Done <- struct{}{} | response.Done <- struct{}{} | ||||
| getty2.GetGettyRemotingInstance().RemoveMessageFuture(msgID) | |||||
| getty.GetGettyRemotingInstance().RemoveMessageFuture(msgID) | |||||
| } | } | ||||
| } | } | ||||
| getty2.GetGettyRemotingInstance().RemoveMergedMessageFuture(rpcMessage.ID) | |||||
| getty.GetGettyRemotingInstance().RemoveMergedMessageFuture(rpcMessage.ID) | |||||
| } | } | ||||
| return nil | return nil | ||||
| } else { | } else { | ||||
| // 如果是请求消息,做处理逻辑 | // 如果是请求消息,做处理逻辑 | ||||
| msgFuture := getty2.GetGettyRemotingInstance().GetMessageFuture(rpcMessage.ID) | |||||
| msgFuture := getty.GetGettyRemotingInstance().GetMessageFuture(rpcMessage.ID) | |||||
| if msgFuture != nil { | if msgFuture != nil { | ||||
| getty2.GetGettyRemotingInstance().NotifyRpcMessageResponse(rpcMessage) | |||||
| getty2.GetGettyRemotingInstance().RemoveMessageFuture(rpcMessage.ID) | |||||
| getty.GetGettyRemotingInstance().NotifyRpcMessageResponse(rpcMessage) | |||||
| getty.GetGettyRemotingInstance().RemoveMessageFuture(rpcMessage.ID) | |||||
| } else { | } else { | ||||
| if _, ok := rpcMessage.Body.(message.AbstractResultMessage); ok { | if _, ok := rpcMessage.Body.(message.AbstractResultMessage); ok { | ||||
| log.Infof("the rm client received response msg [{}] from tc server.", msgFuture) | log.Infof("the rm client received response msg [{}] from tc server.", msgFuture) | ||||
| @@ -23,13 +23,13 @@ import ( | |||||
| "github.com/seata/seata-go/pkg/common/log" | "github.com/seata/seata-go/pkg/common/log" | ||||
| "github.com/seata/seata-go/pkg/protocol/message" | "github.com/seata/seata-go/pkg/protocol/message" | ||||
| getty2 "github.com/seata/seata-go/pkg/remoting/getty" | |||||
| "github.com/seata/seata-go/pkg/remoting/getty" | |||||
| "github.com/seata/seata-go/pkg/rm" | "github.com/seata/seata-go/pkg/rm" | ||||
| ) | ) | ||||
| func init() { | func init() { | ||||
| rmBranchCommitProcessor := &rmBranchCommitProcessor{} | rmBranchCommitProcessor := &rmBranchCommitProcessor{} | ||||
| getty2.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_BranchCommit, rmBranchCommitProcessor) | |||||
| getty.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_BranchCommit, rmBranchCommitProcessor) | |||||
| } | } | ||||
| type rmBranchCommitProcessor struct { | type rmBranchCommitProcessor struct { | ||||
| @@ -46,22 +46,42 @@ func (f *rmBranchCommitProcessor) Process(ctx context.Context, rpcMessage messag | |||||
| status, err := rm.GetResourceManagerInstance().GetResourceManager(request.BranchType).BranchCommit(ctx, request.BranchType, xid, branchID, resourceID, applicationData) | status, err := rm.GetResourceManagerInstance().GetResourceManager(request.BranchType).BranchCommit(ctx, request.BranchType, xid, branchID, resourceID, applicationData) | ||||
| if err != nil { | if err != nil { | ||||
| log.Infof("Branch commit error: %s", err.Error()) | |||||
| log.Infof("branch commit error: %s", err.Error()) | |||||
| return err | return err | ||||
| } | } | ||||
| log.Infof("branch commit success: xid %s, branchID %s, resourceID %s, applicationData %s", xid, branchID, resourceID, applicationData) | |||||
| var ( | |||||
| resultCode message.ResultCode | |||||
| errMsg string | |||||
| ) | |||||
| if err != nil { | |||||
| resultCode = message.ResultCodeFailed | |||||
| errMsg = err.Error() | |||||
| } else { | |||||
| resultCode = message.ResultCodeSuccess | |||||
| } | |||||
| // reply commit response to tc server | // reply commit response to tc server | ||||
| // todo add TransactionExceptionCode | |||||
| response := message.BranchCommitResponse{ | response := message.BranchCommitResponse{ | ||||
| AbstractBranchEndResponse: message.AbstractBranchEndResponse{ | AbstractBranchEndResponse: message.AbstractBranchEndResponse{ | ||||
| AbstractTransactionResponse: message.AbstractTransactionResponse{ | |||||
| AbstractResultMessage: message.AbstractResultMessage{ | |||||
| ResultCode: resultCode, | |||||
| Msg: errMsg, | |||||
| }, | |||||
| }, | |||||
| Xid: xid, | Xid: xid, | ||||
| BranchId: branchID, | BranchId: branchID, | ||||
| BranchStatus: status, | BranchStatus: status, | ||||
| }, | }, | ||||
| } | } | ||||
| err = getty2.GetGettyRemotingClient().SendAsyncResponse(response) | |||||
| err = getty.GetGettyRemotingClient().SendAsyncResponse(response) | |||||
| if err != nil { | if err != nil { | ||||
| log.Error("BranchCommitResponse error: {%#v}", err.Error()) | |||||
| log.Errorf("send branch commit response error: {%#v}", err.Error()) | |||||
| return err | return err | ||||
| } | } | ||||
| log.Infof("send branch commit response success: xid %s, branchID %s, resourceID %s, applicationData %s", xid, branchID, resourceID, applicationData) | |||||
| return nil | return nil | ||||
| } | } | ||||
| @@ -23,13 +23,13 @@ import ( | |||||
| "github.com/seata/seata-go/pkg/common/log" | "github.com/seata/seata-go/pkg/common/log" | ||||
| "github.com/seata/seata-go/pkg/protocol/message" | "github.com/seata/seata-go/pkg/protocol/message" | ||||
| getty2 "github.com/seata/seata-go/pkg/remoting/getty" | |||||
| "github.com/seata/seata-go/pkg/remoting/getty" | |||||
| "github.com/seata/seata-go/pkg/rm" | "github.com/seata/seata-go/pkg/rm" | ||||
| ) | ) | ||||
| func init() { | func init() { | ||||
| rmBranchRollbackProcessor := &rmBranchRollbackProcessor{} | rmBranchRollbackProcessor := &rmBranchRollbackProcessor{} | ||||
| getty2.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_BranchRollback, rmBranchRollbackProcessor) | |||||
| getty.GetGettyClientHandlerInstance().RegisterProcessor(message.MessageType_BranchRollback, rmBranchRollbackProcessor) | |||||
| } | } | ||||
| type rmBranchRollbackProcessor struct { | type rmBranchRollbackProcessor struct { | ||||
| @@ -42,26 +42,44 @@ func (f *rmBranchRollbackProcessor) Process(ctx context.Context, rpcMessage mess | |||||
| branchID := request.BranchId | branchID := request.BranchId | ||||
| resourceID := request.ResourceId | resourceID := request.ResourceId | ||||
| applicationData := request.ApplicationData | applicationData := request.ApplicationData | ||||
| log.Infof("Branch committing: xid %s, branchID %s, resourceID %s, applicationData %s", xid, branchID, resourceID, applicationData) | |||||
| log.Infof("Branch rollback request: xid %s, branchID %s, resourceID %s, applicationData %s", xid, branchID, resourceID, applicationData) | |||||
| status, err := rm.GetResourceManagerInstance().GetResourceManager(request.BranchType).BranchRollback(ctx, request.BranchType, xid, branchID, resourceID, applicationData) | status, err := rm.GetResourceManagerInstance().GetResourceManager(request.BranchType).BranchRollback(ctx, request.BranchType, xid, branchID, resourceID, applicationData) | ||||
| if err != nil { | if err != nil { | ||||
| log.Infof("Branch commit error: %s", err.Error()) | |||||
| log.Infof("branch rollback error: %s", err.Error()) | |||||
| return err | return err | ||||
| } | } | ||||
| log.Infof("branch rollback success: xid %s, branchID %s, resourceID %s, applicationData %s", xid, branchID, resourceID, applicationData) | |||||
| var ( | |||||
| resultCode message.ResultCode | |||||
| errMsg string | |||||
| ) | |||||
| if err != nil { | |||||
| resultCode = message.ResultCodeFailed | |||||
| errMsg = err.Error() | |||||
| } else { | |||||
| resultCode = message.ResultCodeSuccess | |||||
| } | |||||
| // reply commit response to tc server | // reply commit response to tc server | ||||
| response := message.BranchRollbackResponse{ | response := message.BranchRollbackResponse{ | ||||
| AbstractBranchEndResponse: message.AbstractBranchEndResponse{ | AbstractBranchEndResponse: message.AbstractBranchEndResponse{ | ||||
| AbstractTransactionResponse: message.AbstractTransactionResponse{ | |||||
| AbstractResultMessage: message.AbstractResultMessage{ | |||||
| ResultCode: resultCode, | |||||
| Msg: errMsg, | |||||
| }, | |||||
| }, | |||||
| Xid: xid, | Xid: xid, | ||||
| BranchId: branchID, | BranchId: branchID, | ||||
| BranchStatus: status, | BranchStatus: status, | ||||
| }, | }, | ||||
| } | } | ||||
| err = getty2.GetGettyRemotingClient().SendAsyncResponse(response) | |||||
| err = getty.GetGettyRemotingClient().SendAsyncResponse(response) | |||||
| if err != nil { | if err != nil { | ||||
| log.Error("BranchCommitResponse error: {%#v}", err.Error()) | |||||
| log.Errorf("send branch rollback response error: {%#v}", err.Error()) | |||||
| return err | return err | ||||
| } | } | ||||
| log.Infof("send branch rollback response success: xid %s, branchID %s, resourceID %s, applicationData %s", xid, branchID, resourceID, applicationData) | |||||
| return nil | return nil | ||||
| } | } | ||||
| @@ -96,7 +96,7 @@ func (t *TCCServiceProxy) RegisteBranch(ctx context.Context, param interface{}) | |||||
| branchId, err := rm.GetRMRemotingInstance().BranchRegister(branch.BranchTypeTCC, t.GetActionName(), "", tm.GetXID(ctx), string(tccContextStr), "") | branchId, err := rm.GetRMRemotingInstance().BranchRegister(branch.BranchTypeTCC, t.GetActionName(), "", tm.GetXID(ctx), string(tccContextStr), "") | ||||
| if err != nil { | if err != nil { | ||||
| err = errors.New(fmt.Sprintf("BranchRegister error: %v", err.Error())) | err = errors.New(fmt.Sprintf("BranchRegister error: %v", err.Error())) | ||||
| log.Error(err.Error()) | |||||
| log.Errorf(err.Error()) | |||||
| return err | return err | ||||
| } | } | ||||
| @@ -111,11 +111,13 @@ func (g *GlobalTransactionManager) Commit(ctx context.Context, gtr *GlobalTransa | |||||
| break | break | ||||
| } | } | ||||
| } | } | ||||
| if err == nil && res != nil { | |||||
| if err == nil { | |||||
| log.Infof("GlobalCommitRequest commit success, xid %s", gtr.Xid) | |||||
| gtr.Status = res.(message.GlobalCommitResponse).GlobalStatus | gtr.Status = res.(message.GlobalCommitResponse).GlobalStatus | ||||
| UnbindXid(ctx) | |||||
| return nil | |||||
| } | } | ||||
| UnbindXid(ctx) | |||||
| log.Infof("GlobalCommitRequest commit success, xid %s", gtr.Xid) | |||||
| log.Errorf("GlobalCommitRequest commit failed, xid %s, error %v", gtr.Xid, err) | |||||
| return err | return err | ||||
| } | } | ||||
| @@ -147,10 +149,13 @@ func (g *GlobalTransactionManager) Rollback(ctx context.Context, gtr *GlobalTran | |||||
| break | break | ||||
| } | } | ||||
| } | } | ||||
| if err == nil && res != nil { | |||||
| if err == nil { | |||||
| log.Errorf("GlobalRollbackRequest rollback success, xid %s", gtr.Xid) | |||||
| gtr.Status = res.(message.GlobalRollbackResponse).GlobalStatus | gtr.Status = res.(message.GlobalRollbackResponse).GlobalStatus | ||||
| UnbindXid(ctx) | |||||
| return nil | |||||
| } | } | ||||
| UnbindXid(ctx) | |||||
| log.Errorf("GlobalRollbackRequest rollback failed, xid %s, error %v", gtr.Xid, err) | |||||
| return err | return err | ||||
| } | } | ||||
| @@ -20,7 +20,6 @@ package test | |||||
| import ( | import ( | ||||
| "context" | "context" | ||||
| "testing" | "testing" | ||||
| "time" | |||||
| "github.com/seata/seata-go/pkg/tm" | "github.com/seata/seata-go/pkg/tm" | ||||
| @@ -81,6 +80,7 @@ func TestNew(test *testing.T) { | |||||
| defer func() { | defer func() { | ||||
| resp := tm.CommitOrRollback(ctx, err) | resp := tm.CommitOrRollback(ctx, err) | ||||
| log.Infof("tx result %v", resp) | log.Infof("tx result %v", resp) | ||||
| <-make(chan bool) | |||||
| }() | }() | ||||
| tccService := tcc.NewTCCServiceProxy(TestTCCServiceBusiness{}) | tccService := tcc.NewTCCServiceProxy(TestTCCServiceBusiness{}) | ||||
| @@ -97,5 +97,4 @@ func TestNew(test *testing.T) { | |||||
| return | return | ||||
| } | } | ||||
| time.Sleep(time.Second * 1000) | |||||
| } | } | ||||