diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..d82b89c7 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = tab +indent_size = 4 +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.yml] +indent_size = 2 diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 965fdca1..10a898c7 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -3,33 +3,86 @@ name: CI # Controls when the action will run. Triggers the workflow on push or pull request -# events but only for the dev branch +# events for all branches and tags on: push: - branches: [ dev ] + branches: [ '**' ] pull_request: - branches: [ dev ] + branches: [ '**' ] # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: # This workflow contains a single job called "lint" - lint: + lint-and-test: + strategy: + matrix: + go-version: [ 1.15.x ] # The type of runner that the job will run on runs-on: ubuntu-latest # Steps represent a sequence of tasks that will be executed as part of the job steps: - name: Set up Go - uses: actions/setup-go@v1 + uses: actions/setup-go@v2 with: - go-version: 1.15 - + go-version: ${{ matrix.go-version }} + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v2 - - - name: Lint Go Code + - name: Checkout code + uses: actions/checkout@v2 + + - name: Go Build + run: | + go build ./... + + - name: Go Vet + run: | + go vet -v ./... + + - name: GolangCI Lint + run: | + curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.39.0 + golangci-lint run ./... + + - name: Unit Tests + run: | + mkdir -p build + go test ./... -coverprofile=./build/c.out + + - name: Code Coverage + run: | + go get github.com/axw/gocov/gocov + go get github.com/AlekSi/gocov-xml + go tool cover -html=build/c.out -o build/coverage.html + gocov convert build/c.out | gocov-xml > build/coverage.xml + + - name: Archive code coverage results + uses: actions/upload-artifact@v2 + with: + name: code-coverage-report + path: build/ + + docker-build: + strategy: + matrix: + go-version: [ 1.15.x ] + # The type of runner that the job will run on + runs-on: ubuntu-latest + steps: + - name: Docker Build + if: ${{ github.ref == 'refs/heads/master' || github.ref == 'refs/heads/v2' || contains(github.ref, 'release') }} + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + run: | + go mod tidy + REGISTRY=$DOCKER_USERNAME make build-images + + - name: Push + if: ${{ github.ref == 'refs/heads/master' || github.ref == 'refs/heads/v2' || contains(github.ref, 'release') }} + env: + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + COMMIT: ${{ github.sha }} run: | - export PATH=$PATH:$(go env GOPATH)/bin # temporary fix. See https://github.com/actions/setup-go/issues/14 - go get -u golang.org/x/lint/golint - golint ./... - go test ./... + echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin + REGISTRY=$DOCKER_USERNAME make push diff --git a/.gitignore b/.gitignore index 9b59d8c9..a83666d2 100644 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,5 @@ root.data.1 trace.out cmd/tc/cmd cmd/tc/tc -cmd/tc/trace.out \ No newline at end of file +cmd/tc/trace.out +dist/tc \ No newline at end of file diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 00000000..5e19633b --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,18 @@ +run: + deadline: 5m + +linters: + disable-all: true + enable: + - deadcode + - errcheck + - gosimple + - govet + - ineffassign + - staticcheck + - structcheck + - typecheck + - varcheck + - goimports + - gocritic + - revive diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..ef9bb45d --- /dev/null +++ b/Makefile @@ -0,0 +1,45 @@ +GOFILES_NOVENDOR = $(shell find . -type f -name '*.go' -not -path "./vendor/*") +GO_VERSION = 1.15 + +REGISTRY ?= seataio +TAG = $(shell git rev-parse --abbrev-ref HEAD) +COMMIT = git-$(shell git rev-parse --short HEAD) +DATE = $(shell date +"%Y-%m-%d_%H:%M:%S") +GOLDFLAGS = "-w -s -extldflags '-z now' -X github.com/opentrx/seata-golang/versions.COMMIT=$(COMMIT) -X github.com/opentrx/seata-golang/versions.BUILDDATE=$(DATE)" + + +.PHONY: build-go +build-go: + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -buildmode=pie -o $(CURDIR)/dist/tc -ldflags $(GOLDFLAGS) -v ./cmd/tc + +.PHONY: build-bin +build-bin: + docker run --rm -e GOOS=linux -e GOCACHE=/tmp -e GOARCH=$(ARCH) -e GOPROXY=https://goproxy.cn \ + -u $(shell id -u):$(shell id -g) \ + -v $(CURDIR):/go/src/github.com/opentrx/seata-golang:ro \ + -v $(CURDIR)/dist:/go/src/github.com/opentrx/seata-golang/dist/ \ + golang:$(GO_VERSION) /bin/bash -c '\ + cd /go/src/github.com/opentrx/seata-golang && \ + make build-go ' + +.PHONY: build-images +build-images: build-bin + docker build -t $(REGISTRY)/seata-golang:$(TAG) --build-arg ARCH=amd64 -f dist/Dockerfile dist/ + +.PHONY: push +push: + docker push $(REGISTRY)/seata-golang:$(TAG) + +.PHONY: lint +lint: + @gofmt -d $(GOFILES_NOVENDOR) + @if [ $$(gofmt -l $(GOFILES_NOVENDOR) | wc -l) -ne 0 ]; then \ + echo "Code differs from gofmt's style" 1>&2 && exit 1; \ + fi + @GOOS=linux go vet ./... + @GOOS=linux gosec -exclude=G204,G601 ./... + + +.PHONY: clean +clean: + $(RM) dist/tc \ No newline at end of file diff --git a/cmd/profiles/dev/config.yml b/cmd/profiles/dev/config.yml index 8048a16c..63be8066 100644 --- a/cmd/profiles/dev/config.yml +++ b/cmd/profiles/dev/config.yml @@ -3,10 +3,11 @@ server: maxRollbackRetryTimeout: -1 maxCommitRetryTimeout: -1 rollbackRetryTimeoutUnlockEnable: true - asyncCommittingRetryPeriod: 10s - committingRetryPeriod: 1s + asyncCommittingRetryPeriod: 1s + committingRetryPeriod: 5s rollingBackRetryPeriod: 1s timeoutRetryPeriod: 1s + streamMessageTimeout: 30s enforcementPolicy: minTime: 5s permitWithoutStream: true @@ -40,5 +41,5 @@ storage: # maxidleconnections: 20 # maxlifetime: 4h log: - logPath: /Users/scottlewis/dksl/current/seata-golang/cmd/profiles/dev/seata.log + logPath: /Users/scottlewis/dksl/git/1/seata-golang/cmd/profiles/dev/seata.log logLevel: info diff --git a/cmd/tc/main.go b/cmd/tc/main.go index fcf34f9e..a3cd543a 100644 --- a/cmd/tc/main.go +++ b/cmd/tc/main.go @@ -2,8 +2,9 @@ package main import ( "fmt" - "github.com/opentrx/seata-golang/v2/pkg/util/uuid" "net" + "net/http" + _ "net/http/pprof" "os" "github.com/urfave/cli/v2" @@ -13,10 +14,11 @@ import ( "github.com/opentrx/seata-golang/v2/pkg/tc/config" _ "github.com/opentrx/seata-golang/v2/pkg/tc/metrics" "github.com/opentrx/seata-golang/v2/pkg/tc/server" - _ "github.com/opentrx/seata-golang/v2/pkg/tc/storage/driver/in_memory" + _ "github.com/opentrx/seata-golang/v2/pkg/tc/storage/driver/inmemory" _ "github.com/opentrx/seata-golang/v2/pkg/tc/storage/driver/mysql" _ "github.com/opentrx/seata-golang/v2/pkg/tc/storage/driver/pgsql" "github.com/opentrx/seata-golang/v2/pkg/util/log" + "github.com/opentrx/seata-golang/v2/pkg/util/uuid" ) func main() { @@ -42,24 +44,34 @@ func main() { configPath := c.String("config") serverNode := c.Int64("serverNode") - config, err := resolveConfiguration(configPath) + cfg, err := resolveConfiguration(configPath) + if err != nil || cfg == nil { + return err + } - uuid.Init(serverNode) - log.Init(config.Log.LogPath, config.Log.LogLevel) + _ = uuid.Init(serverNode) + log.Init(cfg.Log.LogPath, cfg.Log.LogLevel) - address := fmt.Sprintf(":%v", config.Server.Port) + address := fmt.Sprintf(":%v", cfg.Server.Port) lis, err := net.Listen("tcp", address) if err != nil { log.Fatalf("failed to listen: %v", err) } - s := grpc.NewServer(grpc.KeepaliveEnforcementPolicy(config.GetEnforcementPolicy()), - grpc.KeepaliveParams(config.GetServerParameters())) + s := grpc.NewServer(grpc.KeepaliveEnforcementPolicy(cfg.GetEnforcementPolicy()), + grpc.KeepaliveParams(cfg.GetServerParameters())) - tc := server.NewTransactionCoordinator(config) + tc := server.NewTransactionCoordinator(cfg) apis.RegisterTransactionManagerServiceServer(s, tc) apis.RegisterResourceManagerServiceServer(s, tc) + go func() { + err = http.ListenAndServe(":10001", nil) + if err != nil { + return + } + }() + if err := s.Serve(lis); err != nil { log.Fatalf("failed to serve: %v", err) } @@ -93,12 +105,17 @@ func resolveConfiguration(configPath string) (*config.Configuration, error) { return nil, err } - defer fp.Close() + defer func(fp *os.File) { + err = fp.Close() + if err != nil { + log.Error(err) + } + }(fp) - config, err := config.Parse(fp) + cfg, err := config.Parse(fp) if err != nil { return nil, fmt.Errorf("error parsing %s: %v", configurationPath, err) } - return config, nil + return cfg, nil } diff --git a/dist/Dockerfile b/dist/Dockerfile new file mode 100644 index 00000000..88ba4a68 --- /dev/null +++ b/dist/Dockerfile @@ -0,0 +1,17 @@ +FROM alpine:3.14.1 + +RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && \ + apk add --no-cache tcpdump lsof net-tools tzdata curl dumb-init libc6-compat + +ENV TZ Asia/Shanghai +ENV PATH=$PATH:/opt/seata-golang/bin + +WORKDIR /opt/seata-golang/bin + +COPY tc /opt/seata-golang/bin/tc +COPY config.yml /etc/seata-golang/config.yml +RUN chmod +x /opt/seata-golang/bin/tc + +ENTRYPOINT ["/usr/bin/dumb-init", "--"] + +CMD ["/opt/seata-golang/bin/tc", "start", "-config", "/etc/seata-golang/config.yml"] \ No newline at end of file diff --git a/dist/config.yml b/dist/config.yml new file mode 100644 index 00000000..c169b916 --- /dev/null +++ b/dist/config.yml @@ -0,0 +1,44 @@ +server: + port: 8091 + maxRollbackRetryTimeout: -1 + maxCommitRetryTimeout: -1 + rollbackRetryTimeoutUnlockEnable: true + asyncCommittingRetryPeriod: 10s + committingRetryPeriod: 1s + rollingBackRetryPeriod: 1s + timeoutRetryPeriod: 1s +enforcementPolicy: + minTime: 5s + permitWithoutStream: true +serverParameters: + maxConnectionIdle: 15s + maxConnectionAge: 30s + maxConnectionAgeGrace: 5s + time: 5s + timeout: 1s +clientParameters: + time: 10s + timeout: 1s + permitWithoutStream: true +storage: + # inMemory driver only for testing + inmemory: +# mysql: +# dsn: "root:123456@tcp(127.0.0.1:3306)/seata?timeout=1s&readTimeout=1s&writeTimeout=1s&parseTime=true&loc=Local&charset=utf8mb4,utf8" +# globaltable: global_table2 +# branchtable: branch_table2 +# locktable: lock_table +# maxopenconnections: 100 +# maxidleconnections: 20 +# maxlifetime: 4h +# pgsql: +# dsn: "postgres://postgres:123456@127.0.0.1:5432/seata?search_path=public&sslmode=disable" +# globaltable: global_table +# branchtable: branch_table +# locktable: lock_table +# maxopenconnections: 100 +# maxidleconnections: 20 +# maxlifetime: 4h +log: + logPath: seata.log + logLevel: info diff --git a/go.mod b/go.mod index 8ce3e2c1..6dfdbe45 100644 --- a/go.mod +++ b/go.mod @@ -14,9 +14,10 @@ require ( github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a github.com/stretchr/testify v1.7.0 // indirect github.com/urfave/cli/v2 v2.3.0 + go.uber.org/atomic v1.7.0 go.uber.org/zap v1.17.0 - golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect - golang.org/x/tools v0.1.4 // indirect + golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 // indirect + golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect google.golang.org/grpc v1.38.0 gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect gopkg.in/yaml.v2 v2.4.0 diff --git a/go.sum b/go.sum index 453a64ec..e9ccf996 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,5 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.37.4 h1:glPeL3BQJsbF6aIIYfZizMwc5LTYz250bDMjttbBGAU= cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= @@ -23,7 +22,6 @@ github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= @@ -43,7 +41,6 @@ github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6l github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -78,7 +75,6 @@ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7 github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -117,10 +113,6 @@ github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.6.2 h1:88crIK23zO6TqlQBt+f9FrPJNKm9ZEr7qjp9vl/d5TM= -github.com/gin-gonic/gin v1.6.2/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -130,18 +122,8 @@ github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgO github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= -github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1Vv0sFl1UcHBOY= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= @@ -178,7 +160,6 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= @@ -205,7 +186,6 @@ github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51 github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= @@ -253,15 +233,12 @@ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/k0kubun/pp v3.0.1+incompatible h1:3tqvf7QgUnZ5tXO6pNAZlrvHgl6DvifjDrd9g2S9Z40= github.com/k0kubun/pp v3.0.1+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= @@ -271,15 +248,11 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570/go.mod h1:BLt8L9ld7wVsvEWQbuLrUZnCMnUmLZ+CGDzKtclrTlE= github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f/go.mod h1:UGmTpUd3rjbtfIpwAPrcfmGf/Z1HS95TATB+m57TPB8= github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042/go.mod h1:TPpsiPUEh0zFL1Snz4crhMlBe60PYxRHr5oFF3rRYg0= @@ -290,11 +263,9 @@ github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0U github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw= github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o= @@ -311,10 +282,8 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -354,7 +323,6 @@ github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9 github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -363,7 +331,6 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829 h1:D+CiwcpGTW6pL6bv6KI3KbyEyCKyS+1JWS2h8PNDnGA= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= @@ -375,13 +342,11 @@ github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66Id github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0 h1:kUZDBDTdBVBYBj5Tmh2NZLlF60mfjA27rM34b+cVwNU= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -391,7 +356,6 @@ github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB8 github.com/prometheus/common v0.15.0 h1:4fgOnadei3EZvgRwxJ7RMpG1k1pOZth5Pc13tyspaKM= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1 h1:/K3IL0Z1quvmJ7X0A1AwNEK7CRkVK3YwfOU/QAL4WGg= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -410,7 +374,6 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/shirou/gopsutil v3.20.11+incompatible h1:LJr4ZQK4mPpIV5gOa4jCOKOGb4ty4DZO54I4FGqIpto= github.com/shirou/gopsutil v3.20.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= @@ -443,7 +406,6 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -454,10 +416,6 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1 github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3/go.mod h1:QDlpd3qS71vYtakd2hmdpqhJ9nwv6mD6A30bQ1BPBFE= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1 h1:+mkCCcOFKPnCmVYVcURKps1Xe+3zP90gSYGNfRkjoIY= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= @@ -466,7 +424,6 @@ github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/X github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= @@ -510,7 +467,6 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -529,10 +485,7 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -541,7 +494,6 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -565,9 +517,7 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974 h1:IX6qOQeG5uLjB/hjjwjedwfjND0hgjPMMyO1RoIXQNI= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb h1:eBmm0M9fYhWpKZLjQUUKka/LtIxf46G4fxeEz5KJr9U= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= @@ -583,7 +533,6 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -614,12 +563,10 @@ golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201223074533-0d417f636930 h1:vRgIt+nup/B/BwIS0g2oC0haq0iqbV3ZA+u6+0TlNCo= golang.org/x/sys v0.0.0-20201223074533-0d417f636930/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE= @@ -664,10 +611,7 @@ golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201014170642-d1624618ad65/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a h1:CB3a9Nez8M13wwlr/E2YtwoU+qYHKfC+JrDa45RXXoQ= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.4 h1:cVngSRcfgyZCzys3KYOpCFa+4dqX/Oub9tAq00ttGVs= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -683,9 +627,7 @@ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9Ywl google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.0 h1:Tfd7cKwKbFRsI8RMAD3oqqw7JPFRrvFlOsfbgVkjOOw= google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -700,7 +642,6 @@ google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBr google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98 h1:LCO0fg4kb6WwkXQXRQQgUYsFeFb5taTX5WAx5O/Vt28= google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -727,7 +668,6 @@ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= @@ -735,7 +675,6 @@ google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4 google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= @@ -753,12 +692,10 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWD gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= diff --git a/pkg/apis/seata.pb.go b/pkg/apis/seata.pb.go index 4849cda7..da89542a 100644 --- a/pkg/apis/seata.pb.go +++ b/pkg/apis/seata.pb.go @@ -8,6 +8,7 @@ import ( fmt "fmt" _ "github.com/gogo/protobuf/gogoproto" proto "github.com/gogo/protobuf/proto" + types "github.com/gogo/protobuf/types" io "io" math "math" math_bits "math/bits" @@ -51,61 +52,42 @@ func (ResultCode) EnumDescriptor() ([]byte, []int) { type ExceptionCode int32 const ( - //* // Unknown transaction error code. UnknownErr ExceptionCode = 0 - //* // BeginFailed BeginFailed ExceptionCode = 1 - //* // Lock key conflict transaction error code. LockKeyConflict ExceptionCode = 2 - //* // Io transaction error code. IO ExceptionCode = 3 - //* // Branch rollback failed retryable transaction error code. BranchRollbackFailedRetryable ExceptionCode = 4 - //* // Branch rollback failed unretryable transaction error code. BranchRollbackFailedUnretryable ExceptionCode = 5 - //* // Branch register failed transaction error code. BranchRegisterFailed ExceptionCode = 6 - //* // Branch report failed transaction error code. BranchReportFailed ExceptionCode = 7 - //* // Lockable check failed transaction error code. LockableCheckFailed ExceptionCode = 8 - //* // Branch transaction not exist transaction error code. BranchTransactionNotExist ExceptionCode = 9 - //* // Global transaction not exist transaction error code. GlobalTransactionNotExist ExceptionCode = 10 - //* // Global transaction not active transaction error code. GlobalTransactionNotActive ExceptionCode = 11 - //* // Global transaction status invalid transaction error code. GlobalTransactionStatusInvalid ExceptionCode = 12 - //* // Failed to send branch commit request transaction error code. FailedToSendBranchCommitRequest ExceptionCode = 13 - //* // Failed to send branch rollback request transaction error code. FailedToSendBranchRollbackRequest ExceptionCode = 14 - //* // Failed to add branch transaction error code. FailedToAddBranch ExceptionCode = 15 - //* // Failed to lock global transaction error code. FailedLockGlobalTransaction ExceptionCode = 16 - //* // FailedWriteSession FailedWriteSession ExceptionCode = 17 - //* // Failed to holder error code FailedStore ExceptionCode = 18 ) @@ -158,66 +140,77 @@ func (ExceptionCode) EnumDescriptor() ([]byte, []int) { return fileDescriptor_450a439f8893981f, []int{1} } +type BranchMessageType int32 + +const ( + TypeBranchCommit BranchMessageType = 0 + TypeBranchCommitResult BranchMessageType = 1 + TypeBranchRollback BranchMessageType = 2 + TypeBranchRollBackResult BranchMessageType = 3 +) + +var BranchMessageType_name = map[int32]string{ + 0: "TypeBranchCommit", + 1: "TypeBranchCommitResult", + 2: "TypeBranchRollback", + 3: "TypeBranchRollBackResult", +} + +var BranchMessageType_value = map[string]int32{ + "TypeBranchCommit": 0, + "TypeBranchCommitResult": 1, + "TypeBranchRollback": 2, + "TypeBranchRollBackResult": 3, +} + +func (BranchMessageType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_450a439f8893981f, []int{2} +} + type GlobalSession_GlobalStatus int32 const ( - //* // Un known global status. UnknownGlobalStatus GlobalSession_GlobalStatus = 0 - //* // PHASE 1: can accept new branch registering. Begin GlobalSession_GlobalStatus = 1 - //* // PHASE 2: Running Status: may be changed any time. Committing GlobalSession_GlobalStatus = 2 - //* // The Commit retrying. // Retrying commit after a recoverable failure. CommitRetrying GlobalSession_GlobalStatus = 3 - //* // Rolling back global status. RollingBack GlobalSession_GlobalStatus = 4 - //* // The Rollback retrying. // Retrying rollback after a recoverable failure. RollbackRetrying GlobalSession_GlobalStatus = 5 - //* // The Timeout rolling back. // Rolling back since timeout TimeoutRollingBack GlobalSession_GlobalStatus = 6 - //* // The Timeout rollback retrying. // Retrying rollback (since timeout) after a recoverable failure. TimeoutRollbackRetrying GlobalSession_GlobalStatus = 7 - //* - // All branches can be async committed. The committing is NOT done yet, but it can be seen as committed for TM/RM - // rpc_client. + // All branches can be async committed. The committing is NOT done yet, but it can be seen as + // committed for TM/RM rpc_client. AsyncCommitting GlobalSession_GlobalStatus = 8 - //* // PHASE 2: Final Status: will NOT change any more. // Finally: global transaction is successfully committed. Committed GlobalSession_GlobalStatus = 9 - //* // The Commit failed. // Finally: failed to commit CommitFailed GlobalSession_GlobalStatus = 10 - //* // The RolledBack. // Finally: global transaction is successfully rollback. RolledBack GlobalSession_GlobalStatus = 11 - //* // The Rollback failed. // Finally: failed to rollback RollbackFailed GlobalSession_GlobalStatus = 12 - //* // The Timeout rolled back. // Finally: global transaction is successfully rollback since timeout. TimeoutRolledBack GlobalSession_GlobalStatus = 13 - //* // The Timeout rollback failed. // Finally: failed to rollback since timeout TimeoutRollbackFailed GlobalSession_GlobalStatus = 14 - //* // The Finished. // Not managed in getty_session MAP any more Finished GlobalSession_GlobalStatus = 15 @@ -295,45 +288,34 @@ func (BranchSession_BranchType) EnumDescriptor() ([]byte, []int) { type BranchSession_BranchStatus int32 const ( - //* // description:BranchStatus_Unknown branch status. UnknownBranchStatus BranchSession_BranchStatus = 0 - //* // description:BranchStatus_Registered to TC. Registered BranchSession_BranchStatus = 1 - //* // The Phase one done. // description:Branch logic is successfully done at phase one. PhaseOneDone BranchSession_BranchStatus = 2 - //* // The Phase one failed. // description:Branch logic is failed at phase one. PhaseOneFailed BranchSession_BranchStatus = 3 - //* // The Phase one timeout. // description:Branch logic is NOT reported for a timeout. PhaseOneTimeout BranchSession_BranchStatus = 4 - //* // The Phase two committed. // description:Commit logic is successfully done at phase two. PhaseTwoCommitted BranchSession_BranchStatus = 5 - //* // The Phase two commit failed retryable. // description:Commit logic is failed but retryable. PhaseTwoCommitFailedRetryable BranchSession_BranchStatus = 6 - //* // The Phase two commit failed and can not retry. // description:Commit logic is failed and NOT retryable. PhaseTwoCommitFailedCanNotRetry BranchSession_BranchStatus = 7 - //* // The Phase two rollback completed. // description:Rollback logic is successfully done at phase two. PhaseTwoRolledBack BranchSession_BranchStatus = 8 - //* // The Phase two rollback failed retryable. // description:Rollback logic is failed but retryable. PhaseTwoRollbackFailedRetryable BranchSession_BranchStatus = 9 - //* // The Phase two rollback failed and can not retry. // description:Rollback logic is failed but NOT retryable. PhaseTwoRollbackFailedCanNotRetry BranchSession_BranchStatus = 10 @@ -2020,9 +2002,69 @@ func (m *BranchRollbackResponse) GetBranchStatus() BranchSession_BranchStatus { return UnknownBranchStatus } +type BranchMessage struct { + ID int64 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` + BranchMessageType BranchMessageType `protobuf:"varint,2,opt,name=BranchMessageType,proto3,enum=apis.BranchMessageType" json:"BranchMessageType,omitempty"` + Message *types.Any `protobuf:"bytes,3,opt,name=Message,proto3" json:"Message,omitempty"` +} + +func (m *BranchMessage) Reset() { *m = BranchMessage{} } +func (*BranchMessage) ProtoMessage() {} +func (*BranchMessage) Descriptor() ([]byte, []int) { + return fileDescriptor_450a439f8893981f, []int{23} +} +func (m *BranchMessage) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *BranchMessage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_BranchMessage.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *BranchMessage) XXX_Merge(src proto.Message) { + xxx_messageInfo_BranchMessage.Merge(m, src) +} +func (m *BranchMessage) XXX_Size() int { + return m.Size() +} +func (m *BranchMessage) XXX_DiscardUnknown() { + xxx_messageInfo_BranchMessage.DiscardUnknown(m) +} + +var xxx_messageInfo_BranchMessage proto.InternalMessageInfo + +func (m *BranchMessage) GetID() int64 { + if m != nil { + return m.ID + } + return 0 +} + +func (m *BranchMessage) GetBranchMessageType() BranchMessageType { + if m != nil { + return m.BranchMessageType + } + return TypeBranchCommit +} + +func (m *BranchMessage) GetMessage() *types.Any { + if m != nil { + return m.Message + } + return nil +} + func init() { proto.RegisterEnum("apis.ResultCode", ResultCode_name, ResultCode_value) proto.RegisterEnum("apis.ExceptionCode", ExceptionCode_name, ExceptionCode_value) + proto.RegisterEnum("apis.BranchMessageType", BranchMessageType_name, BranchMessageType_value) proto.RegisterEnum("apis.GlobalSession_GlobalStatus", GlobalSession_GlobalStatus_name, GlobalSession_GlobalStatus_value) proto.RegisterEnum("apis.BranchSession_BranchType", BranchSession_BranchType_name, BranchSession_BranchType_value) proto.RegisterEnum("apis.BranchSession_BranchStatus", BranchSession_BranchStatus_name, BranchSession_BranchStatus_value) @@ -2049,127 +2091,134 @@ func init() { proto.RegisterType((*BranchCommitResponse)(nil), "apis.BranchCommitResponse") proto.RegisterType((*BranchRollbackRequest)(nil), "apis.BranchRollbackRequest") proto.RegisterType((*BranchRollbackResponse)(nil), "apis.BranchRollbackResponse") + proto.RegisterType((*BranchMessage)(nil), "apis.BranchMessage") } func init() { proto.RegisterFile("seata.proto", fileDescriptor_450a439f8893981f) } var fileDescriptor_450a439f8893981f = []byte{ - // 1830 bytes of a gzipped FileDescriptorProto + // 1931 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x59, 0xcd, 0x6f, 0x23, 0x49, - 0x15, 0x77, 0xb7, 0xbf, 0x5f, 0x62, 0xbb, 0x52, 0x99, 0x24, 0x4e, 0x86, 0xb4, 0x33, 0xbd, 0x5a, - 0x91, 0x1d, 0xd8, 0xc9, 0x2a, 0x23, 0x90, 0x16, 0x21, 0x56, 0x76, 0x92, 0x1d, 0x42, 0xd8, 0xdd, - 0xa1, 0x93, 0x15, 0x2b, 0x2e, 0xa3, 0x4e, 0xbb, 0x70, 0x5a, 0xb1, 0xbb, 0x4d, 0x77, 0x7b, 0x92, - 0xdc, 0xb8, 0x73, 0x00, 0xb4, 0x37, 0x24, 0x6e, 0x1c, 0x38, 0xed, 0x8d, 0x13, 0xfc, 0x01, 0x1c, - 0x38, 0xcc, 0x09, 0xed, 0xc9, 0x62, 0x32, 0x42, 0x80, 0x04, 0xd2, 0xca, 0x07, 0xce, 0xa8, 0x3e, - 0xda, 0x5d, 0xd5, 0x76, 0xd6, 0x93, 0x05, 0x84, 0x99, 0x63, 0xbf, 0xfa, 0xd5, 0xab, 0x57, 0xef, - 0xbd, 0xdf, 0x7b, 0x55, 0xd5, 0xb0, 0x10, 0x12, 0x3b, 0xb2, 0x1f, 0xf4, 0x03, 0x3f, 0xf2, 0x71, - 0xce, 0xee, 0xbb, 0xe1, 0x06, 0x74, 0xfc, 0x8e, 0xcf, 0x25, 0xe6, 0x2f, 0x0a, 0x50, 0x79, 0xd4, - 0xf5, 0x4f, 0xed, 0xee, 0x31, 0x09, 0x43, 0xd7, 0xf7, 0xf0, 0xd7, 0x00, 0x9a, 0xed, 0x76, 0x40, - 0xbf, 0xbc, 0x4e, 0x5d, 0xdb, 0xd2, 0xb6, 0xcb, 0xad, 0x95, 0xd1, 0xb0, 0xb1, 0x74, 0xe9, 0x07, - 0xbd, 0x6f, 0x98, 0xf6, 0x78, 0xcc, 0xb4, 0x24, 0x20, 0xde, 0x82, 0xec, 0x47, 0x87, 0xfb, 0x75, - 0x9d, 0xe1, 0xab, 0xa3, 0x61, 0x03, 0x38, 0xfe, 0xd2, 0x6d, 0x9b, 0x16, 0x1d, 0xc2, 0xef, 0x40, - 0xe5, 0x24, 0xb0, 0xbd, 0xd0, 0x76, 0x22, 0xd7, 0xf7, 0x0e, 0xf7, 0xeb, 0xd9, 0x2d, 0x6d, 0x3b, - 0xdb, 0x5a, 0x1f, 0x0d, 0x1b, 0x2b, 0x1c, 0x1b, 0x25, 0xc3, 0x4f, 0xe8, 0x34, 0x15, 0x8f, 0x0f, - 0xa0, 0x26, 0x09, 0xde, 0xb7, 0x7b, 0xa4, 0x9e, 0x63, 0xcb, 0xdd, 0x1d, 0x0d, 0x1b, 0x6b, 0x93, - 0x2a, 0x3c, 0xbb, 0x47, 0x4c, 0x2b, 0x3d, 0x07, 0x7f, 0x15, 0x8a, 0x27, 0x6e, 0x8f, 0xf8, 0x83, - 0xa8, 0x9e, 0xdf, 0xd2, 0xb6, 0xf3, 0x2d, 0x3c, 0x1a, 0x36, 0xaa, 0x62, 0x3a, 0x1f, 0x30, 0xad, - 0x18, 0x82, 0x1f, 0x42, 0xb9, 0x45, 0x3a, 0xae, 0x47, 0xbf, 0xeb, 0x05, 0x66, 0xb1, 0xe4, 0x8d, - 0x53, 0x3a, 0xf4, 0x84, 0xce, 0x32, 0xad, 0x04, 0x87, 0x8f, 0xa0, 0x70, 0x1c, 0xd9, 0xd1, 0x20, - 0xac, 0x17, 0xb7, 0xb4, 0xed, 0xea, 0xee, 0xd6, 0x03, 0xea, 0xf8, 0x07, 0x8a, 0xa3, 0xe3, 0x2f, - 0x86, 0x6b, 0x2d, 0x8d, 0x86, 0x8d, 0x0a, 0xd7, 0x19, 0x32, 0x89, 0x69, 0x09, 0x15, 0xf8, 0x0d, - 0x28, 0x34, 0x9d, 0xc8, 0x7d, 0x4a, 0xea, 0xa5, 0x2d, 0x6d, 0xbb, 0x24, 0x43, 0x6d, 0x26, 0x37, - 0x2d, 0x01, 0x30, 0xff, 0xa0, 0xc3, 0xa2, 0xac, 0x16, 0xaf, 0xc1, 0xf2, 0x87, 0xde, 0xb9, 0xe7, - 0x5f, 0x78, 0xb2, 0x18, 0x65, 0x70, 0x19, 0xf2, 0xcc, 0x5c, 0xa4, 0xe1, 0x2a, 0xc0, 0x9e, 0xdf, - 0xeb, 0xb9, 0x51, 0xe4, 0x7a, 0x1d, 0xa4, 0x63, 0x0c, 0x55, 0xfe, 0x6d, 0x91, 0x28, 0xb8, 0xa2, - 0xb2, 0x2c, 0xae, 0xc1, 0x82, 0xe5, 0x77, 0xbb, 0xae, 0xd7, 0x69, 0xd9, 0xce, 0x39, 0xca, 0xe1, - 0x3b, 0x80, 0xa8, 0xe0, 0xd4, 0x76, 0xce, 0xc7, 0xb0, 0x3c, 0x5e, 0x05, 0x2c, 0xfc, 0x26, 0xa3, - 0x0b, 0xf8, 0x2e, 0xac, 0x49, 0x72, 0x65, 0x52, 0x11, 0x2f, 0x43, 0xad, 0x19, 0x5e, 0x79, 0x8e, - 0x64, 0x44, 0x09, 0x57, 0xa0, 0x2c, 0xbe, 0x49, 0x1b, 0x95, 0x31, 0x82, 0x45, 0xfe, 0xf9, 0xae, - 0xed, 0x76, 0x49, 0x1b, 0x01, 0xb5, 0x9a, 0xea, 0x22, 0x6d, 0xb6, 0xc4, 0x02, 0xb5, 0x3a, 0xd6, - 0x2d, 0x30, 0x8b, 0x78, 0x05, 0x96, 0xa4, 0x65, 0x05, 0xb4, 0x82, 0xd7, 0x61, 0x25, 0x65, 0x8d, - 0x98, 0x51, 0xc5, 0x8b, 0x50, 0x7a, 0xd7, 0xf5, 0xdc, 0xf0, 0x8c, 0xb4, 0x51, 0xcd, 0xfc, 0x49, - 0x11, 0x2a, 0xad, 0xc0, 0xf6, 0x9c, 0xb3, 0xff, 0x3a, 0x39, 0xde, 0x82, 0x12, 0x5f, 0x69, 0xcc, - 0x8b, 0x3b, 0xa3, 0x61, 0x03, 0x89, 0x2c, 0x63, 0x23, 0x8c, 0x12, 0x63, 0xd4, 0x24, 0x9d, 0x72, - 0xb7, 0xa4, 0xd3, 0xd7, 0x01, 0x2c, 0x12, 0xfa, 0x83, 0xc0, 0x21, 0x87, 0xfb, 0x8c, 0x0a, 0xe5, - 0xd6, 0xea, 0x68, 0xd8, 0xc0, 0x7c, 0x76, 0x20, 0xc6, 0xd8, 0x54, 0x09, 0x89, 0xdf, 0x84, 0xe2, - 0x77, 0x7d, 0xe7, 0xfc, 0x88, 0x5c, 0x31, 0x3e, 0x94, 0x5b, 0xcb, 0xa3, 0x61, 0xa3, 0xc6, 0x27, - 0x75, 0x7d, 0xe7, 0xfc, 0xc9, 0x39, 0xb9, 0x32, 0xad, 0x18, 0x83, 0xbf, 0x03, 0xb9, 0x93, 0xab, - 0x3e, 0x11, 0x4c, 0x30, 0x38, 0x13, 0x14, 0xaf, 0x8a, 0x2f, 0x8a, 0x92, 0x0d, 0x10, 0xbb, 0x8e, - 0xae, 0xfa, 0xc4, 0xb4, 0x98, 0x0e, 0x89, 0x57, 0x25, 0x99, 0x57, 0xd3, 0xb4, 0xcd, 0xe6, 0xd5, - 0x01, 0xd4, 0x9a, 0xfd, 0x7e, 0xd7, 0x75, 0x6c, 0xea, 0x90, 0x7d, 0x3b, 0xb2, 0xeb, 0xe5, 0x2d, - 0x6d, 0x7b, 0x51, 0x2e, 0x27, 0x76, 0x02, 0x78, 0xd2, 0xb6, 0x23, 0xdb, 0xb4, 0xd2, 0x73, 0xcc, - 0x1d, 0x80, 0xc4, 0x7e, 0x5c, 0x00, 0xbd, 0x79, 0x82, 0x32, 0xb8, 0x08, 0xd9, 0x93, 0xbd, 0x3d, - 0xa4, 0xe1, 0x12, 0xe4, 0x8e, 0x9b, 0x8f, 0x9a, 0x48, 0xa7, 0x43, 0x1f, 0x35, 0x51, 0xd6, 0xfc, - 0x8d, 0x0e, 0x8b, 0xb2, 0x8d, 0x12, 0x49, 0x65, 0x31, 0xca, 0xb0, 0x1c, 0x27, 0x1d, 0x37, 0x8c, - 0x48, 0x40, 0xda, 0x48, 0xa3, 0x2c, 0x78, 0x7c, 0x66, 0x87, 0xe4, 0x03, 0x8f, 0xec, 0xfb, 0x1e, - 0xe1, 0x5c, 0x8d, 0x25, 0x22, 0x87, 0xb3, 0x94, 0x4f, 0xb1, 0x4c, 0xa4, 0x39, 0xca, 0x51, 0x2a, - 0x30, 0xe1, 0xc9, 0x85, 0x9f, 0xf0, 0x2a, 0x8f, 0xef, 0xc1, 0xa6, 0x2a, 0xe6, 0x5a, 0x18, 0x3b, - 0xed, 0xd3, 0x2e, 0x41, 0x05, 0xfc, 0x1a, 0x34, 0xa6, 0x41, 0xf6, 0x6c, 0xef, 0x7d, 0x9f, 0x97, - 0x08, 0x54, 0xa4, 0xc4, 0x8f, 0x41, 0x12, 0xd5, 0x4a, 0xf2, 0x64, 0x95, 0x6b, 0xc9, 0x0a, 0x65, - 0xfc, 0x3a, 0xdc, 0x9b, 0x0e, 0x92, 0xd7, 0x00, 0xf3, 0x8f, 0x3a, 0x14, 0x2d, 0xff, 0x82, 0xe6, - 0x55, 0x4c, 0x28, 0xed, 0x16, 0xdd, 0x46, 0xbf, 0x25, 0x3d, 0x6e, 0xcf, 0x48, 0x95, 0x50, 0xb9, - 0x97, 0x26, 0xd4, 0x43, 0x28, 0x9f, 0x50, 0x57, 0xb0, 0x8e, 0x96, 0x4f, 0xd7, 0x94, 0x88, 0x0e, - 0x89, 0x5e, 0x96, 0xe0, 0xf0, 0x26, 0xe8, 0x8f, 0x8f, 0x04, 0x01, 0x2b, 0xa3, 0x61, 0xa3, 0xcc, - 0xd1, 0xfd, 0x73, 0xd3, 0xd2, 0x1f, 0x1f, 0xe1, 0xfb, 0x50, 0xb0, 0xfc, 0x0b, 0xca, 0xd1, 0x22, - 0x83, 0x48, 0x3d, 0x2e, 0xf0, 0x2f, 0x38, 0x45, 0x05, 0xc2, 0xbc, 0x04, 0xcc, 0xbb, 0x03, 0xeb, - 0x08, 0x16, 0xf9, 0xd1, 0x80, 0x84, 0x11, 0x36, 0x26, 0x4b, 0x9d, 0x52, 0xd3, 0xea, 0x49, 0x1b, - 0xa5, 0xae, 0xcd, 0x27, 0x2d, 0x73, 0x7b, 0xb2, 0x4f, 0x67, 0xd9, 0xf4, 0xb4, 0xd8, 0xfc, 0x44, - 0x83, 0x65, 0x65, 0xe9, 0xb0, 0xef, 0x7b, 0x21, 0xc1, 0x6f, 0x31, 0x4f, 0x0e, 0xba, 0xd1, 0x9e, - 0xdf, 0x26, 0x6c, 0xed, 0xea, 0x2e, 0xe2, 0x5c, 0x4f, 0xe4, 0x96, 0x84, 0xc1, 0x6f, 0x43, 0xe5, - 0xe0, 0xd2, 0x21, 0x7d, 0xaa, 0x9a, 0x4d, 0xd2, 0xd9, 0xa4, 0x65, 0x3e, 0x49, 0x19, 0xb2, 0x54, - 0x24, 0xdd, 0xc8, 0x7b, 0x24, 0x0c, 0xed, 0x4e, 0x6c, 0x66, 0xfc, 0x89, 0x11, 0xcf, 0x32, 0x16, - 0x49, 0x96, 0x55, 0xe6, 0x3f, 0x34, 0x58, 0xe1, 0xf1, 0x8e, 0x89, 0xf9, 0xb2, 0xee, 0x42, 0x52, - 0x0b, 0xe0, 0x19, 0x6a, 0x28, 0xe9, 0xc2, 0x97, 0x96, 0xd3, 0xa2, 0x9e, 0xd4, 0x59, 0x6e, 0xc1, - 0xb8, 0xa4, 0x7e, 0x4b, 0x2e, 0x39, 0x2c, 0x63, 0x66, 0x16, 0x56, 0x4b, 0x2e, 0x52, 0xdb, 0x93, - 0x95, 0x8f, 0x26, 0xd2, 0xe2, 0x64, 0x71, 0xfb, 0xad, 0x06, 0xab, 0xe9, 0xfd, 0xce, 0x57, 0x8c, - 0x36, 0x24, 0x9a, 0xb2, 0x0e, 0x98, 0x10, 0xd2, 0xfc, 0x58, 0x87, 0xe5, 0xd8, 0xfa, 0xbe, 0x1f, - 0x44, 0x71, 0xac, 0x90, 0x54, 0x3d, 0x78, 0x2c, 0x64, 0x2d, 0xba, 0xaa, 0x65, 0x66, 0x9c, 0xd4, - 0x68, 0xe4, 0x6e, 0x1d, 0x8d, 0x7d, 0xb5, 0x1d, 0x88, 0x78, 0xce, 0x6c, 0x6d, 0x96, 0xda, 0x44, - 0x5e, 0x3e, 0xa6, 0xbf, 0xd4, 0xe0, 0x8e, 0xea, 0x95, 0xb9, 0x8a, 0xa8, 0xf9, 0x2b, 0x0d, 0x56, - 0x79, 0x51, 0xa0, 0xf9, 0xfe, 0xbd, 0x01, 0x09, 0xae, 0x6e, 0x0e, 0x9c, 0x1a, 0x1c, 0xfd, 0xf3, - 0x48, 0x94, 0xfd, 0x3c, 0x12, 0xdd, 0x3a, 0x6c, 0xe6, 0xef, 0x34, 0x58, 0x9b, 0x30, 0x73, 0xee, - 0xb8, 0x41, 0x6d, 0xa3, 0x3d, 0x83, 0x6d, 0xb0, 0x64, 0x8d, 0xbf, 0xcd, 0x2f, 0xc7, 0x95, 0x57, - 0x64, 0xd3, 0x4d, 0x1e, 0x36, 0x5f, 0x68, 0x70, 0x47, 0x45, 0xce, 0xd7, 0x26, 0xf7, 0xd5, 0x2b, - 0x8f, 0x88, 0xe4, 0xcc, 0x1b, 0x97, 0xa5, 0xcc, 0x4a, 0xdc, 0x11, 0x5f, 0x7d, 0x66, 0xbb, 0x23, - 0x46, 0xbe, 0x8a, 0xee, 0x78, 0x03, 0x56, 0xf8, 0x77, 0x72, 0x5f, 0xbb, 0xc9, 0x21, 0x7f, 0x1e, - 0xd3, 0x35, 0xc1, 0xbe, 0x8a, 0x2e, 0xe9, 0xc5, 0x19, 0x32, 0xab, 0x97, 0xa4, 0x97, 0xd3, 0xbf, - 0xd0, 0x72, 0x49, 0x9e, 0xcd, 0x65, 0x95, 0xfe, 0x0f, 0x39, 0xf5, 0x2f, 0x5a, 0xdc, 0xa1, 0x67, - 0xf0, 0xee, 0xdf, 0xea, 0xd0, 0xf3, 0x70, 0x92, 0xfa, 0xb9, 0x1e, 0x77, 0xdd, 0xf9, 0xac, 0x1b, - 0x13, 0x67, 0x5d, 0xc5, 0xe3, 0xf9, 0x94, 0xc7, 0xd3, 0x67, 0x96, 0xc2, 0x17, 0x39, 0xb3, 0x98, - 0x7f, 0x4b, 0x4e, 0xd3, 0xb3, 0xca, 0xcc, 0xff, 0x7d, 0xfc, 0x3f, 0xd6, 0xc7, 0x27, 0xe9, 0x39, - 0x2d, 0x93, 0xff, 0x83, 0x0c, 0xb8, 0xff, 0xb6, 0xbc, 0x75, 0xf6, 0xa8, 0x38, 0xfe, 0x12, 0xef, - 0x19, 0x19, 0xbc, 0x02, 0x4b, 0x89, 0xf4, 0x78, 0xe0, 0x38, 0x24, 0x0c, 0x91, 0x76, 0xff, 0xa7, - 0xb9, 0x94, 0x13, 0x70, 0x15, 0x40, 0xbc, 0xa3, 0x1c, 0x04, 0x01, 0xca, 0xe0, 0x1a, 0x2c, 0xb0, - 0x6b, 0xa5, 0xd0, 0xa4, 0xe1, 0x65, 0xa8, 0x89, 0xc0, 0xef, 0xf9, 0xde, 0x0f, 0xbb, 0xae, 0x13, - 0xf1, 0x67, 0x99, 0xc3, 0x0f, 0x50, 0x16, 0xdf, 0x83, 0x4d, 0x35, 0x3e, 0xe9, 0x87, 0x8a, 0x1c, - 0x7e, 0x0d, 0x1a, 0xd3, 0x20, 0x1f, 0x7a, 0xc1, 0x18, 0x94, 0xc7, 0xf5, 0xe4, 0x74, 0xcd, 0x6f, - 0x4c, 0x62, 0xf9, 0x02, 0x5e, 0x05, 0x2c, 0x9f, 0xbb, 0x85, 0xbc, 0x88, 0xd7, 0x60, 0x39, 0x3e, - 0x96, 0xed, 0x9d, 0x91, 0xf1, 0x6b, 0x64, 0x09, 0x6f, 0xc2, 0xba, 0xc8, 0x35, 0xe9, 0xde, 0xec, - 0x47, 0x07, 0x97, 0x6e, 0x18, 0xa1, 0x32, 0x1d, 0xe6, 0xc5, 0x74, 0xda, 0x30, 0x60, 0x03, 0x36, - 0xa6, 0x0d, 0xf3, 0xa7, 0x62, 0xb4, 0x80, 0x4d, 0x30, 0x26, 0xc6, 0x79, 0x58, 0x0e, 0xbd, 0xa7, - 0x76, 0xd7, 0x6d, 0xa3, 0x45, 0xba, 0x63, 0x6e, 0xcd, 0x89, 0x7f, 0x4c, 0xbc, 0xf6, 0x94, 0x52, - 0x8d, 0x2a, 0xf8, 0x75, 0xb8, 0x37, 0x09, 0x4a, 0x31, 0x1a, 0x55, 0x69, 0x1c, 0x63, 0x58, 0xb3, - 0x2d, 0x50, 0xa8, 0x86, 0x1b, 0x70, 0x97, 0x8b, 0xa9, 0x0f, 0x26, 0x0c, 0x42, 0x88, 0xba, 0x8d, - 0x03, 0xbe, 0x1f, 0xb8, 0x11, 0x11, 0x49, 0x85, 0x96, 0x68, 0x78, 0xb9, 0xfc, 0x38, 0xf2, 0x03, - 0x82, 0xf0, 0xee, 0xdf, 0x75, 0x58, 0x97, 0xa6, 0xbe, 0x67, 0x7b, 0x76, 0x87, 0x04, 0xc7, 0x24, - 0x78, 0xea, 0x3a, 0x04, 0x7f, 0x53, 0xbc, 0x78, 0xe3, 0xba, 0xdc, 0xa3, 0xe4, 0x27, 0x8f, 0x8d, - 0xf5, 0x29, 0x23, 0x82, 0xa3, 0x2d, 0x28, 0x3f, 0x22, 0x91, 0xb8, 0x6b, 0x29, 0x38, 0xe5, 0xfc, - 0xbc, 0xb1, 0x31, 0x6d, 0x48, 0xe8, 0x38, 0x88, 0x5b, 0x26, 0x8f, 0xbf, 0xaa, 0x46, 0x39, 0x55, - 0xa8, 0x6a, 0x52, 0x07, 0x80, 0x77, 0xa0, 0xc0, 0x23, 0xa0, 0x2a, 0x50, 0xa2, 0xa2, 0x2a, 0x48, - 0x75, 0x9c, 0x03, 0x28, 0xc5, 0xd1, 0xc1, 0x77, 0x95, 0x85, 0xd4, 0x98, 0x6d, 0x7c, 0x69, 0xfa, - 0x20, 0x57, 0xb3, 0xfb, 0x4f, 0x0d, 0x56, 0xe3, 0x22, 0x9b, 0xf2, 0xf5, 0x11, 0x54, 0x55, 0x0e, - 0xc4, 0xeb, 0x4c, 0x7d, 0x3b, 0x89, 0xd7, 0xb9, 0xe1, 0xa1, 0xe1, 0x20, 0xae, 0x34, 0xaa, 0xdb, - 0xa6, 0x5c, 0xec, 0xe3, 0x5d, 0x4f, 0xbd, 0xdd, 0x7e, 0x1b, 0xca, 0xe3, 0x8b, 0x1a, 0x56, 0x76, - 0x96, 0xbe, 0x66, 0x6e, 0x6c, 0xde, 0x30, 0x2a, 0x36, 0xfe, 0x89, 0x06, 0xf5, 0x09, 0x5e, 0xc6, - 0x5b, 0x1f, 0x5b, 0xab, 0xc6, 0x68, 0x0a, 0x73, 0x54, 0x6b, 0x53, 0x31, 0x4a, 0x3c, 0x98, 0x8a, - 0xd4, 0x54, 0x76, 0xa5, 0x3c, 0x98, 0x8a, 0x54, 0xcb, 0x7e, 0xf6, 0xdc, 0xc8, 0x7c, 0xfa, 0xdc, - 0xc8, 0x7c, 0xf6, 0xdc, 0xd0, 0x7e, 0x7c, 0x6d, 0x68, 0xbf, 0xbe, 0x36, 0xb4, 0xdf, 0x5f, 0x1b, - 0xda, 0xb3, 0x6b, 0x43, 0xfb, 0xd3, 0xb5, 0xa1, 0xfd, 0xf5, 0xda, 0xc8, 0x7c, 0x76, 0x6d, 0x68, - 0x3f, 0x7b, 0x61, 0x64, 0x9e, 0xbd, 0x30, 0x32, 0x9f, 0xbe, 0x30, 0x32, 0x3f, 0xf8, 0x4a, 0xc7, - 0x8d, 0xce, 0x06, 0xa7, 0x0f, 0x1c, 0xbf, 0xb7, 0xe3, 0xf7, 0x89, 0x17, 0x05, 0x97, 0x3b, 0xec, - 0x67, 0xe2, 0x9b, 0x1d, 0xbf, 0x6b, 0x7b, 0x9d, 0x9d, 0xa7, 0xbb, 0x3b, 0xfd, 0xf3, 0xce, 0x0e, - 0x5d, 0xf9, 0xb4, 0xc0, 0x7e, 0x27, 0x3e, 0xfc, 0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0x80, 0xd1, - 0xad, 0xb2, 0x6f, 0x1c, 0x00, 0x00, + 0x15, 0x77, 0xb7, 0xbf, 0x5f, 0x62, 0xbb, 0x52, 0xce, 0x87, 0xe3, 0xd9, 0xb4, 0x33, 0xbd, 0x5a, + 0xe1, 0x1d, 0xd8, 0x64, 0x94, 0x11, 0x48, 0x8b, 0x10, 0x2b, 0x3b, 0xc9, 0x0e, 0x21, 0xec, 0xee, + 0xd0, 0xc9, 0x8a, 0x15, 0x97, 0x51, 0xc7, 0xae, 0x75, 0x5a, 0x71, 0xba, 0x4d, 0x77, 0x7b, 0x12, + 0x8b, 0x0b, 0x77, 0x0e, 0x80, 0x56, 0xe2, 0x80, 0xc4, 0x8d, 0x03, 0x27, 0x6e, 0x1c, 0x10, 0xfc, + 0x01, 0x1c, 0x38, 0xcc, 0x09, 0xed, 0xc9, 0x62, 0x12, 0x21, 0x40, 0x02, 0x69, 0xe5, 0xbf, 0x00, + 0xd5, 0x47, 0xbb, 0xab, 0x6c, 0x67, 0x3d, 0x59, 0x40, 0x64, 0xf7, 0x58, 0xef, 0xfd, 0xaa, 0xea, + 0xf5, 0x7b, 0xef, 0xf7, 0x5e, 0x55, 0x35, 0x2c, 0x04, 0xc4, 0x0e, 0xed, 0xad, 0x9e, 0xef, 0x85, + 0x1e, 0x4e, 0xd9, 0x3d, 0x27, 0xa8, 0x42, 0xc7, 0xeb, 0x78, 0x5c, 0x52, 0x5d, 0xef, 0x78, 0x5e, + 0xa7, 0x4b, 0xb6, 0xd9, 0xe8, 0xa4, 0xff, 0xe1, 0xb6, 0xed, 0x0e, 0xb8, 0xca, 0xfc, 0x45, 0x06, + 0x0a, 0x8f, 0xbb, 0xde, 0x89, 0xdd, 0x3d, 0x22, 0x41, 0xe0, 0x78, 0x2e, 0xfe, 0x2a, 0x40, 0xa3, + 0xdd, 0xf6, 0xe9, 0xc8, 0xed, 0x54, 0xb4, 0x4d, 0xad, 0x9e, 0x6f, 0xae, 0x8c, 0x86, 0xb5, 0xa5, + 0x4b, 0xcf, 0x3f, 0xff, 0xba, 0x69, 0x8f, 0x75, 0xa6, 0x25, 0x01, 0xf1, 0x26, 0x24, 0x3f, 0x38, + 0xd8, 0xab, 0xe8, 0x0c, 0x5f, 0x1c, 0x0d, 0x6b, 0xc0, 0xf1, 0x97, 0x4e, 0xdb, 0xb4, 0xa8, 0x0a, + 0xbf, 0x05, 0x85, 0x63, 0xdf, 0x76, 0x03, 0xbb, 0x15, 0x3a, 0x9e, 0x7b, 0xb0, 0x57, 0x49, 0x6e, + 0x6a, 0xf5, 0x64, 0x73, 0x7d, 0x34, 0xac, 0xad, 0x70, 0x6c, 0x18, 0xab, 0x9f, 0xd2, 0x69, 0x2a, + 0x1e, 0xef, 0x43, 0x49, 0x12, 0xbc, 0x6b, 0x9f, 0x93, 0x4a, 0x8a, 0x6d, 0x77, 0x6f, 0x34, 0xac, + 0xad, 0x4d, 0x2f, 0xe1, 0xda, 0xe7, 0xc4, 0xb4, 0x26, 0xe7, 0xe0, 0xaf, 0x40, 0xf6, 0xd8, 0x39, + 0x27, 0x5e, 0x3f, 0xac, 0xa4, 0x37, 0xb5, 0x7a, 0xba, 0x89, 0x47, 0xc3, 0x5a, 0x51, 0x4c, 0xe7, + 0x0a, 0xd3, 0x8a, 0x20, 0xf8, 0x11, 0xe4, 0x9b, 0xa4, 0xe3, 0xb8, 0x74, 0x5c, 0xc9, 0x30, 0x8b, + 0x25, 0x6f, 0x9c, 0x50, 0xd5, 0x53, 0x3a, 0xcb, 0xb4, 0x62, 0x1c, 0x3e, 0x84, 0xcc, 0x51, 0x68, + 0x87, 0xfd, 0xa0, 0x92, 0xdd, 0xd4, 0xea, 0xc5, 0x9d, 0xcd, 0x2d, 0x1a, 0x93, 0x2d, 0xc5, 0xd1, + 0xd1, 0x88, 0xe1, 0x9a, 0x4b, 0xa3, 0x61, 0xad, 0xc0, 0xd7, 0x0c, 0x98, 0xc4, 0xb4, 0xc4, 0x12, + 0xf8, 0x75, 0xc8, 0x34, 0x5a, 0xa1, 0xf3, 0x8c, 0x54, 0x72, 0x9b, 0x5a, 0x3d, 0x27, 0x43, 0x6d, + 0x26, 0x37, 0x2d, 0x01, 0x30, 0xff, 0xa4, 0xc3, 0xa2, 0xbc, 0x2c, 0x5e, 0x83, 0xf2, 0xfb, 0xee, + 0x99, 0xeb, 0x5d, 0xb8, 0xb2, 0x18, 0x25, 0x70, 0x1e, 0xd2, 0xcc, 0x5c, 0xa4, 0xe1, 0x22, 0xc0, + 0xae, 0x77, 0x7e, 0xee, 0x84, 0xa1, 0xe3, 0x76, 0x90, 0x8e, 0x31, 0x14, 0xf9, 0xd8, 0x22, 0xa1, + 0x3f, 0xa0, 0xb2, 0x24, 0x2e, 0xc1, 0x82, 0xe5, 0x75, 0xbb, 0x8e, 0xdb, 0x69, 0xda, 0xad, 0x33, + 0x94, 0xc2, 0xcb, 0x80, 0xa8, 0xe0, 0xc4, 0x6e, 0x9d, 0x8d, 0x61, 0x69, 0xbc, 0x0a, 0x58, 0xf8, + 0x4d, 0x46, 0x67, 0xf0, 0x3d, 0x58, 0x93, 0xe4, 0xca, 0xa4, 0x2c, 0x2e, 0x43, 0xa9, 0x11, 0x0c, + 0xdc, 0x96, 0x64, 0x44, 0x0e, 0x17, 0x20, 0x2f, 0xc6, 0xa4, 0x8d, 0xf2, 0x18, 0xc1, 0x22, 0x1f, + 0xbe, 0x6d, 0x3b, 0x5d, 0xd2, 0x46, 0x40, 0xad, 0xa6, 0x6b, 0x91, 0x36, 0xdb, 0x62, 0x81, 0x5a, + 0x1d, 0xad, 0x2d, 0x30, 0x8b, 0x78, 0x05, 0x96, 0xa4, 0x6d, 0x05, 0xb4, 0x80, 0xd7, 0x61, 0x65, + 0xc2, 0x1a, 0x31, 0xa3, 0x88, 0x17, 0x21, 0xf7, 0xb6, 0xe3, 0x3a, 0xc1, 0x29, 0x69, 0xa3, 0x92, + 0xf9, 0xe3, 0x2c, 0x14, 0x9a, 0xbe, 0xed, 0xb6, 0x4e, 0xff, 0xe7, 0xe4, 0x78, 0x08, 0x39, 0xbe, + 0xd3, 0x98, 0x17, 0xcb, 0xa3, 0x61, 0x0d, 0x89, 0x2c, 0x63, 0x1a, 0x46, 0x89, 0x31, 0x6a, 0x9a, + 0x4e, 0xa9, 0x5b, 0xd2, 0xe9, 0x6b, 0x00, 0x16, 0x09, 0xbc, 0xbe, 0xdf, 0x22, 0x07, 0x7b, 0x8c, + 0x0a, 0xf9, 0xe6, 0xea, 0x68, 0x58, 0xc3, 0x7c, 0xb6, 0x2f, 0x74, 0x6c, 0xaa, 0x84, 0xc4, 0x6f, + 0x40, 0xf6, 0x3b, 0x5e, 0xeb, 0xec, 0x90, 0x0c, 0x18, 0x1f, 0xf2, 0xcd, 0xf2, 0x68, 0x58, 0x2b, + 0xf1, 0x49, 0x5d, 0xaf, 0x75, 0xf6, 0xf4, 0x8c, 0x0c, 0x4c, 0x2b, 0xc2, 0xe0, 0x6f, 0x43, 0xea, + 0x78, 0xd0, 0x23, 0x82, 0x09, 0x06, 0x67, 0x82, 0xe2, 0x55, 0x31, 0xa2, 0x28, 0xd9, 0x00, 0xf1, + 0xd5, 0xe1, 0xa0, 0x47, 0x4c, 0x8b, 0xad, 0x21, 0xf1, 0x2a, 0x27, 0xf3, 0x6a, 0xd6, 0x6a, 0xf3, + 0x79, 0xb5, 0x0f, 0xa5, 0x46, 0xaf, 0xd7, 0x75, 0x5a, 0x36, 0x75, 0xc8, 0x9e, 0x1d, 0xda, 0x95, + 0xfc, 0xa6, 0x56, 0x5f, 0x94, 0xcb, 0x89, 0x1d, 0x03, 0x9e, 0xb6, 0xed, 0xd0, 0x36, 0xad, 0xc9, + 0x39, 0xe6, 0x36, 0x40, 0x6c, 0x3f, 0xce, 0x80, 0xde, 0x38, 0x46, 0x09, 0x9c, 0x85, 0xe4, 0xf1, + 0xee, 0x2e, 0xd2, 0x70, 0x0e, 0x52, 0x47, 0x8d, 0xc7, 0x0d, 0xa4, 0x53, 0xd5, 0x07, 0x0d, 0x94, + 0x34, 0x7f, 0xab, 0xc3, 0xa2, 0x6c, 0xa3, 0x44, 0x52, 0x59, 0x8c, 0x12, 0x2c, 0xc7, 0x49, 0xc7, + 0x09, 0x42, 0xe2, 0x93, 0x36, 0xd2, 0x28, 0x0b, 0x9e, 0x9c, 0xda, 0x01, 0x79, 0xcf, 0x25, 0x7b, + 0x9e, 0x4b, 0x38, 0x57, 0x23, 0x89, 0xc8, 0xe1, 0x24, 0xe5, 0x53, 0x24, 0x13, 0x69, 0x8e, 0x52, + 0x94, 0x0a, 0x4c, 0x78, 0x7c, 0xe1, 0xc5, 0xbc, 0x4a, 0xe3, 0xfb, 0xb0, 0xa1, 0x8a, 0xf9, 0x2a, + 0x8c, 0x9d, 0xf6, 0x49, 0x97, 0xa0, 0x0c, 0x7e, 0x15, 0x6a, 0xb3, 0x20, 0xbb, 0xb6, 0xfb, 0xae, + 0xc7, 0x4b, 0x04, 0xca, 0x52, 0xe2, 0x47, 0x20, 0x89, 0x6a, 0x39, 0x79, 0xb2, 0xca, 0xb5, 0x78, + 0x87, 0x3c, 0x7e, 0x0d, 0xee, 0xcf, 0x06, 0xc9, 0x7b, 0x80, 0xf9, 0x67, 0x1d, 0xb2, 0x96, 0x77, + 0x41, 0xf3, 0x2a, 0x22, 0x94, 0x76, 0x8b, 0x6e, 0xa3, 0xdf, 0x92, 0x1e, 0xb7, 0x67, 0xa4, 0x4a, + 0xa8, 0xd4, 0x4b, 0x13, 0xea, 0x11, 0xe4, 0x8f, 0xa9, 0x2b, 0x58, 0x47, 0x4b, 0x4f, 0xd6, 0x94, + 0x90, 0xaa, 0x44, 0x2f, 0x8b, 0x71, 0x78, 0x03, 0xf4, 0x27, 0x87, 0x82, 0x80, 0x85, 0xd1, 0xb0, + 0x96, 0xe7, 0xe8, 0xde, 0x99, 0x69, 0xe9, 0x4f, 0x0e, 0xf1, 0x03, 0xc8, 0x58, 0xde, 0x05, 0xe5, + 0x68, 0x96, 0x41, 0xa4, 0x1e, 0xe7, 0x7b, 0x17, 0x9c, 0xa2, 0x02, 0x61, 0x5e, 0x02, 0xe6, 0xdd, + 0x81, 0x75, 0x04, 0x8b, 0xfc, 0xa0, 0x4f, 0x82, 0x10, 0x1b, 0xd3, 0xa5, 0x4e, 0xa9, 0x69, 0x95, + 0xb8, 0x8d, 0x52, 0xd7, 0xa6, 0xe3, 0x96, 0x59, 0x9f, 0xee, 0xd3, 0x49, 0x36, 0x7d, 0x52, 0x6c, + 0xfe, 0x46, 0x83, 0xb2, 0xb2, 0x75, 0xd0, 0xf3, 0xdc, 0x80, 0xe0, 0x87, 0xcc, 0x93, 0xfd, 0x6e, + 0xb8, 0xeb, 0xb5, 0x09, 0xdb, 0xbb, 0xb8, 0x83, 0x38, 0xd7, 0x63, 0xb9, 0x25, 0x61, 0xf0, 0x9b, + 0x50, 0xd8, 0xbf, 0x6c, 0x91, 0x1e, 0x5d, 0x9a, 0x4d, 0xd2, 0xd9, 0xa4, 0x32, 0x9f, 0xa4, 0xa8, + 0x2c, 0x15, 0x49, 0x3f, 0xe4, 0x1d, 0x12, 0x04, 0x76, 0x27, 0x32, 0x33, 0x1a, 0x62, 0xc4, 0xb3, + 0x8c, 0x45, 0x92, 0x65, 0x95, 0xf9, 0x2f, 0x0d, 0x56, 0x78, 0xbc, 0x23, 0x62, 0xbe, 0xac, 0xbb, + 0x90, 0xd4, 0x02, 0x78, 0x86, 0x1a, 0x4a, 0xba, 0xf0, 0xad, 0xe5, 0xb4, 0xa8, 0xc4, 0x75, 0x96, + 0x5b, 0x30, 0x2e, 0xa9, 0xdf, 0x94, 0x4b, 0x0e, 0xcb, 0x98, 0xb9, 0x85, 0xd5, 0x92, 0x8b, 0x54, + 0x7d, 0xba, 0xf2, 0xd1, 0x44, 0x5a, 0x9c, 0x2e, 0x6e, 0xbf, 0xd7, 0x60, 0x75, 0xf2, 0x7b, 0xef, + 0x56, 0x8c, 0xaa, 0x12, 0x4d, 0x59, 0x07, 0x8c, 0x09, 0x69, 0x7e, 0xa4, 0x43, 0x39, 0xb2, 0xbe, + 0xe7, 0xf9, 0x61, 0x14, 0x2b, 0x24, 0x55, 0x0f, 0x1e, 0x0b, 0x79, 0x15, 0x5d, 0x5d, 0x65, 0x6e, + 0x9c, 0xd4, 0x68, 0xa4, 0x6e, 0x1d, 0x8d, 0x3d, 0xb5, 0x1d, 0x88, 0x78, 0xce, 0x6d, 0x6d, 0x96, + 0xda, 0x44, 0x5e, 0x3e, 0xa6, 0xbf, 0xd4, 0x60, 0x59, 0xf5, 0xca, 0x9d, 0x8a, 0xa8, 0xf9, 0x2b, + 0x0d, 0x56, 0x79, 0x51, 0xa0, 0xf9, 0xfe, 0xdd, 0x3e, 0xf1, 0x07, 0x37, 0x07, 0x4e, 0x0d, 0x8e, + 0xfe, 0x69, 0x24, 0x4a, 0x7e, 0x1a, 0x89, 0x6e, 0x1d, 0x36, 0xf3, 0x0f, 0x1a, 0xac, 0x4d, 0x99, + 0x79, 0xe7, 0xb8, 0x41, 0x6d, 0xa3, 0x3d, 0x83, 0x7d, 0x60, 0xce, 0x1a, 0x8f, 0xcd, 0x2f, 0x45, + 0x95, 0x57, 0x64, 0xd3, 0x4d, 0x1e, 0x36, 0xaf, 0x35, 0x58, 0x56, 0x91, 0x77, 0xeb, 0x23, 0xf7, + 0xd4, 0x2b, 0x8f, 0x88, 0xe4, 0xdc, 0x1b, 0x97, 0xa5, 0xcc, 0x8a, 0xdd, 0x11, 0x5d, 0x7d, 0xe6, + 0xbb, 0x23, 0x42, 0x7e, 0x11, 0xdd, 0xf1, 0x3a, 0xac, 0xf0, 0x71, 0x7c, 0x5f, 0xbb, 0xc9, 0x21, + 0x7f, 0x1d, 0xd3, 0x35, 0xc6, 0x7e, 0x11, 0x5d, 0x72, 0x1e, 0x65, 0xc8, 0xbc, 0x5e, 0x32, 0xb9, + 0x9d, 0xfe, 0x99, 0xb6, 0x8b, 0xf3, 0xec, 0x4e, 0x56, 0xe9, 0xff, 0x92, 0x53, 0xff, 0xa6, 0x45, + 0x1d, 0x7a, 0x0e, 0xef, 0xfe, 0xa3, 0x0e, 0x7d, 0x17, 0x4e, 0x52, 0x3f, 0xd3, 0xa3, 0xae, 0x7b, + 0x37, 0xeb, 0xc6, 0xd4, 0x59, 0x57, 0xf1, 0x78, 0x7a, 0xc2, 0xe3, 0x93, 0x67, 0x96, 0xcc, 0x67, + 0x39, 0xb3, 0x98, 0xff, 0x88, 0x4f, 0xd3, 0xf3, 0xca, 0xcc, 0xe7, 0x3e, 0xfe, 0x1f, 0xe9, 0xe3, + 0x93, 0xf4, 0x1d, 0x2d, 0x93, 0xff, 0x8f, 0x0c, 0xf8, 0xb9, 0x16, 0xbd, 0xb0, 0x45, 0x56, 0x14, + 0x41, 0x17, 0x81, 0x4f, 0x5a, 0x3a, 0x7b, 0xf4, 0x5d, 0x52, 0x00, 0x2c, 0x50, 0xfc, 0x73, 0xd7, + 0xe4, 0xcd, 0x24, 0xb5, 0x35, 0x3d, 0x03, 0x6f, 0xa9, 0x9f, 0xbd, 0xb0, 0xb3, 0xbc, 0xc5, 0x1f, + 0xc5, 0xb7, 0xa2, 0x47, 0xf1, 0xad, 0x86, 0x3b, 0x18, 0x3b, 0xe3, 0xc1, 0x9b, 0x72, 0x4c, 0xd8, + 0x6b, 0xe7, 0x78, 0x24, 0x1e, 0x5a, 0x12, 0x78, 0x05, 0x96, 0x62, 0xe9, 0x51, 0xbf, 0xd5, 0x22, + 0x41, 0x80, 0xb4, 0x07, 0x3f, 0x49, 0x4d, 0x44, 0x07, 0x17, 0x01, 0xc4, 0x03, 0xcf, 0xbe, 0xef, + 0xa3, 0x04, 0x2e, 0xc1, 0x02, 0xbb, 0xef, 0x8a, 0x95, 0x34, 0x5c, 0x86, 0x92, 0xc8, 0xc8, 0x5d, + 0xcf, 0xfd, 0xb0, 0xeb, 0xb4, 0x42, 0xfe, 0x5e, 0x74, 0xf0, 0x1e, 0x4a, 0xe2, 0xfb, 0xb0, 0xa1, + 0x26, 0xce, 0xe4, 0x0b, 0x4a, 0x0a, 0xbf, 0x0a, 0xb5, 0x59, 0x90, 0xf7, 0x5d, 0x7f, 0x0c, 0x4a, + 0xe3, 0x4a, 0x7c, 0xec, 0xe7, 0x57, 0x39, 0xb1, 0x7d, 0x06, 0xaf, 0x02, 0x96, 0x2f, 0x04, 0x42, + 0x9e, 0xc5, 0x6b, 0x50, 0x8e, 0xce, 0x8b, 0xbb, 0xa7, 0x64, 0xfc, 0x4c, 0x9a, 0xc3, 0x1b, 0xb0, + 0x2e, 0x48, 0x20, 0x5d, 0xe8, 0xbd, 0x70, 0xff, 0xd2, 0x09, 0x42, 0x94, 0xa7, 0x6a, 0x5e, 0xe5, + 0x67, 0xa9, 0x01, 0x1b, 0x50, 0x9d, 0xa5, 0xe6, 0x6f, 0xd8, 0x68, 0x01, 0x9b, 0x60, 0x4c, 0xe9, + 0x79, 0xbe, 0x1c, 0xb8, 0xcf, 0xec, 0xae, 0xd3, 0x46, 0x8b, 0xf4, 0x8b, 0xb9, 0x35, 0xc7, 0xde, + 0x11, 0x71, 0xdb, 0x33, 0x7a, 0x08, 0x2a, 0xe0, 0xd7, 0xe0, 0xfe, 0x34, 0x68, 0xa2, 0xd4, 0xa0, + 0x22, 0x8d, 0x63, 0x04, 0x6b, 0xb4, 0x05, 0x0a, 0x95, 0x70, 0x0d, 0xee, 0x71, 0x31, 0xf5, 0xc1, + 0x94, 0x41, 0x08, 0x51, 0xb7, 0x71, 0xc0, 0xf7, 0x7c, 0x27, 0x24, 0x22, 0xdb, 0xd1, 0x12, 0x0d, + 0x2f, 0x97, 0x1f, 0x85, 0x9e, 0x4f, 0x10, 0x7e, 0xf0, 0xc3, 0x19, 0x39, 0x4c, 0x73, 0x8a, 0xbd, + 0x78, 0x4a, 0x96, 0xa3, 0x04, 0xae, 0xc2, 0xea, 0xa4, 0x94, 0xe7, 0x18, 0xd2, 0xd8, 0xeb, 0xfa, + 0x58, 0x17, 0x7d, 0x06, 0xd2, 0xf1, 0x2b, 0x50, 0x51, 0xe5, 0x4d, 0x5e, 0x5d, 0xe8, 0xac, 0xe4, + 0xce, 0x3f, 0x75, 0x58, 0x97, 0xec, 0x7e, 0xc7, 0x76, 0xed, 0x0e, 0xf1, 0x8f, 0x88, 0xff, 0xcc, + 0x69, 0x11, 0xfc, 0x0d, 0xf1, 0x1f, 0x00, 0x57, 0xe4, 0xce, 0x2d, 0x3f, 0x04, 0x55, 0xd7, 0x67, + 0x68, 0x44, 0xe5, 0x6a, 0x42, 0xfe, 0x31, 0x09, 0xc5, 0x0d, 0x54, 0xc1, 0x29, 0xb7, 0x8a, 0x6a, + 0x75, 0x96, 0x4a, 0xac, 0xb1, 0x1f, 0x1d, 0x24, 0x78, 0xf2, 0xa9, 0xcb, 0x28, 0x67, 0x2d, 0x75, + 0x99, 0x89, 0x63, 0xd1, 0x5b, 0x90, 0xe1, 0xee, 0x52, 0x17, 0x50, 0x52, 0x42, 0x5d, 0x60, 0xa2, + 0x0f, 0xef, 0x43, 0x2e, 0xf2, 0x29, 0xbe, 0xa7, 0x6c, 0xa4, 0x26, 0x4c, 0xf5, 0x95, 0xd9, 0x4a, + 0xbe, 0xcc, 0xce, 0xef, 0x74, 0x58, 0x8d, 0x5a, 0xcf, 0x84, 0xaf, 0x1b, 0x51, 0x1a, 0xd0, 0x9d, + 0xfb, 0x2e, 0xed, 0x0e, 0x04, 0x97, 0x67, 0x14, 0xb1, 0xea, 0x2c, 0x61, 0x5d, 0x7b, 0xa8, 0xe1, + 0x43, 0x28, 0xaa, 0x1c, 0x8e, 0x4c, 0x9d, 0xf9, 0x28, 0x15, 0x99, 0x7a, 0xc3, 0x0b, 0xce, 0x7e, + 0x54, 0xc2, 0x55, 0xcf, 0xcf, 0x78, 0x31, 0x89, 0x1c, 0x37, 0xf3, 0xd9, 0xe0, 0x5b, 0x90, 0x1f, + 0xdf, 0x80, 0xb1, 0xe2, 0x9c, 0xc9, 0xfb, 0x7b, 0x75, 0xe3, 0x06, 0x2d, 0x5f, 0xa9, 0x69, 0x3f, + 0x7f, 0x61, 0x24, 0x3e, 0x7e, 0x61, 0x24, 0x3e, 0x79, 0x61, 0x68, 0x3f, 0xba, 0x32, 0xb4, 0x5f, + 0x5f, 0x19, 0xda, 0x1f, 0xaf, 0x0c, 0xed, 0xf9, 0x95, 0xa1, 0xfd, 0xe5, 0xca, 0xd0, 0xfe, 0x7e, + 0x65, 0x24, 0x3e, 0xb9, 0x32, 0xb4, 0x9f, 0x5e, 0x1b, 0x89, 0xe7, 0xd7, 0x46, 0xe2, 0xe3, 0x6b, + 0x23, 0xf1, 0xfd, 0x2f, 0x77, 0x9c, 0xf0, 0xb4, 0x7f, 0xb2, 0xd5, 0xf2, 0xce, 0xb7, 0xbd, 0x1e, + 0x71, 0x43, 0xff, 0x72, 0x9b, 0xfd, 0x0f, 0x7d, 0xa3, 0xe3, 0x75, 0x6d, 0xb7, 0xb3, 0xfd, 0x6c, + 0x67, 0xbb, 0x77, 0xd6, 0xd9, 0xa6, 0x5b, 0x9f, 0x64, 0x58, 0xb9, 0x7f, 0xf4, 0xef, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xf4, 0xc7, 0x17, 0x6a, 0x32, 0x1d, 0x00, 0x00, } func (x ResultCode) String() string { @@ -2186,6 +2235,13 @@ func (x ExceptionCode) String() string { } return strconv.Itoa(int(x)) } +func (x BranchMessageType) String() string { + s, ok := BranchMessageType_name[int32(x)] + if ok { + return s + } + return strconv.Itoa(int(x)) +} func (x GlobalSession_GlobalStatus) String() string { s, ok := GlobalSession_GlobalStatus_name[int32(x)] if ok { @@ -2999,6 +3055,36 @@ func (this *BranchRollbackResponse) Equal(that interface{}) bool { } return true } +func (this *BranchMessage) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*BranchMessage) + if !ok { + that2, ok := that.(BranchMessage) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.ID != that1.ID { + return false + } + if this.BranchMessageType != that1.BranchMessageType { + return false + } + if !this.Message.Equal(that1.Message) { + return false + } + return true +} func (this *GlobalSession) GoString() string { if this == nil { return "nil" @@ -3309,6 +3395,20 @@ func (this *BranchRollbackResponse) GoString() string { s = append(s, "}") return strings.Join(s, "") } +func (this *BranchMessage) GoString() string { + if this == nil { + return "nil" + } + s := make([]string, 0, 7) + s = append(s, "&apis.BranchMessage{") + s = append(s, "ID: "+fmt.Sprintf("%#v", this.ID)+",\n") + s = append(s, "BranchMessageType: "+fmt.Sprintf("%#v", this.BranchMessageType)+",\n") + if this.Message != nil { + s = append(s, "Message: "+fmt.Sprintf("%#v", this.Message)+",\n") + } + s = append(s, "}") + return strings.Join(s, "") +} func valueToGoStringSeata(v interface{}, typ string) string { rv := reflect.ValueOf(v) if rv.IsNil() { @@ -4473,6 +4573,51 @@ func (m *BranchRollbackResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *BranchMessage) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *BranchMessage) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *BranchMessage) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Message != nil { + { + size, err := m.Message.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintSeata(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if m.BranchMessageType != 0 { + i = encodeVarintSeata(dAtA, i, uint64(m.BranchMessageType)) + i-- + dAtA[i] = 0x10 + } + if m.ID != 0 { + i = encodeVarintSeata(dAtA, i, uint64(m.ID)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func encodeVarintSeata(dAtA []byte, offset int, v uint64) int { offset -= sovSeata(v) base := offset @@ -5051,6 +5196,25 @@ func (m *BranchRollbackResponse) Size() (n int) { return n } +func (m *BranchMessage) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ID != 0 { + n += 1 + sovSeata(uint64(m.ID)) + } + if m.BranchMessageType != 0 { + n += 1 + sovSeata(uint64(m.BranchMessageType)) + } + if m.Message != nil { + l = m.Message.Size() + n += 1 + l + sovSeata(uint64(l)) + } + return n +} + func sovSeata(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -5367,6 +5531,18 @@ func (this *BranchRollbackResponse) String() string { }, "") return s } +func (this *BranchMessage) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&BranchMessage{`, + `ID:` + fmt.Sprintf("%v", this.ID) + `,`, + `BranchMessageType:` + fmt.Sprintf("%v", this.BranchMessageType) + `,`, + `Message:` + strings.Replace(fmt.Sprintf("%v", this.Message), "Any", "types.Any", 1) + `,`, + `}`, + }, "") + return s +} func valueToStringSeata(v interface{}) string { rv := reflect.ValueOf(v) if rv.IsNil() { @@ -9157,6 +9333,130 @@ func (m *BranchRollbackResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *BranchMessage) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSeata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: BranchMessage: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: BranchMessage: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + m.ID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSeata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ID |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BranchMessageType", wireType) + } + m.BranchMessageType = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSeata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.BranchMessageType |= BranchMessageType(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowSeata + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthSeata + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthSeata + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Message == nil { + m.Message = &types.Any{} + } + if err := m.Message.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipSeata(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthSeata + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipSeata(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/pkg/apis/seata.proto b/pkg/apis/seata.proto index 0c92a043..07b262e6 100644 --- a/pkg/apis/seata.proto +++ b/pkg/apis/seata.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package apis; import "github.com/gogo/protobuf/gogoproto/gogo.proto"; +import "google/protobuf/any.proto"; option go_package="github.com/opentrx/seata-golang/v2/pkg/apis"; @@ -12,194 +13,131 @@ enum ResultCode { } enum ExceptionCode { - /** - * Unknown transaction error code. - */ + // Unknown transaction error code. UnknownErr = 0; - /** - * BeginFailed - */ + // BeginFailed BeginFailed = 1; - /** - * Lock key conflict transaction error code. - */ + // Lock key conflict transaction error code. LockKeyConflict = 2; - /** - * Io transaction error code. - */ + // Io transaction error code. IO = 3; - /** - * Branch rollback failed retryable transaction error code. - */ + // Branch rollback failed retryable transaction error code. BranchRollbackFailedRetryable = 4; - /** - * Branch rollback failed unretryable transaction error code. - */ + // Branch rollback failed unretryable transaction error code. BranchRollbackFailedUnretryable = 5; - /** - * Branch register failed transaction error code. - */ + // Branch register failed transaction error code. BranchRegisterFailed = 6; - /** - * Branch report failed transaction error code. - */ + // Branch report failed transaction error code. BranchReportFailed = 7; - /** - * Lockable check failed transaction error code. - */ + // Lockable check failed transaction error code. LockableCheckFailed = 8; - /** - * Branch transaction not exist transaction error code. - */ + // Branch transaction not exist transaction error code. BranchTransactionNotExist = 9; - /** - * Global transaction not exist transaction error code. - */ + // Global transaction not exist transaction error code. GlobalTransactionNotExist = 10; - /** - * Global transaction not active transaction error code. - */ + // Global transaction not active transaction error code. GlobalTransactionNotActive = 11; - /** - * Global transaction status invalid transaction error code. - */ + // Global transaction status invalid transaction error code. GlobalTransactionStatusInvalid = 12; - /** - * Failed to send branch commit request transaction error code. - */ + // Failed to send branch commit request transaction error code. FailedToSendBranchCommitRequest = 13; - /** - * Failed to send branch rollback request transaction error code. - */ + // Failed to send branch rollback request transaction error code. FailedToSendBranchRollbackRequest = 14; - /** - * Failed to add branch transaction error code. - */ + // Failed to add branch transaction error code. FailedToAddBranch = 15; - /** - * Failed to lock global transaction error code. - */ + // Failed to lock global transaction error code. FailedLockGlobalTransaction = 16; - /** - * FailedWriteSession - */ + // FailedWriteSession FailedWriteSession = 17; - /** - * Failed to holder error code - */ + // Failed to holder error code FailedStore = 18; } +enum BranchMessageType { + TypeBranchCommit = 0; + TypeBranchCommitResult = 1; + TypeBranchRollback = 2; + TypeBranchRollBackResult = 3; +} + message GlobalSession { enum GlobalStatus { - /** - * Un known global status. - */ + // Un known global status. UnknownGlobalStatus = 0; - /** - * PHASE 1: can accept new branch registering. - */ + // PHASE 1: can accept new branch registering. Begin = 1; - /** - * PHASE 2: Running Status: may be changed any time. - */ + // PHASE 2: Running Status: may be changed any time. Committing = 2; - /** - * The Commit retrying. - * Retrying commit after a recoverable failure. - */ + // The Commit retrying. + // Retrying commit after a recoverable failure. CommitRetrying = 3; - /** - * Rolling back global status. - */ + // Rolling back global status. RollingBack = 4; - /** - * The Rollback retrying. - * Retrying rollback after a recoverable failure. - */ + // The Rollback retrying. + // Retrying rollback after a recoverable failure. RollbackRetrying = 5; - /** - * The Timeout rolling back. - * Rolling back since timeout - */ + // The Timeout rolling back. + // Rolling back since timeout TimeoutRollingBack = 6; - /** - * The Timeout rollback retrying. - * Retrying rollback (since timeout) after a recoverable failure. - */ + // The Timeout rollback retrying. + // Retrying rollback (since timeout) after a recoverable failure. TimeoutRollbackRetrying = 7; - /** - * All branches can be async committed. The committing is NOT done yet, but it can be seen as committed for TM/RM - * rpc_client. - */ + // All branches can be async committed. The committing is NOT done yet, but it can be seen as + // committed for TM/RM rpc_client. AsyncCommitting = 8; - /** - * PHASE 2: Final Status: will NOT change any more. - * Finally: global transaction is successfully committed. - */ + // PHASE 2: Final Status: will NOT change any more. + // Finally: global transaction is successfully committed. Committed = 9; - /** - * The Commit failed. - * Finally: failed to commit - */ + // The Commit failed. + // Finally: failed to commit CommitFailed = 10; - /** - * The RolledBack. - * Finally: global transaction is successfully rollback. - */ + // The RolledBack. + // Finally: global transaction is successfully rollback. RolledBack = 11; - /** - * The Rollback failed. - * Finally: failed to rollback - */ + // The Rollback failed. + // Finally: failed to rollback RollbackFailed = 12; - /** - * The Timeout rolled back. - * Finally: global transaction is successfully rollback since timeout. - */ + // The Timeout rolled back. + // Finally: global transaction is successfully rollback since timeout. TimeoutRolledBack = 13; - /** - * The Timeout rollback failed. - * Finally: failed to rollback since timeout - */ + // The Timeout rollback failed. + // Finally: failed to rollback since timeout TimeoutRollbackFailed = 14; - /** - * The Finished. - * Not managed in getty_session MAP any more - */ + // The Finished. + // Not managed in getty_session MAP any more Finished = 15; } @@ -225,68 +163,46 @@ message BranchSession { } enum BranchStatus { - /** - * description:BranchStatus_Unknown branch status. - */ + // description:BranchStatus_Unknown branch status. UnknownBranchStatus = 0; - /** - * description:BranchStatus_Registered to TC. - */ + // description:BranchStatus_Registered to TC. Registered = 1; - /** - * The Phase one done. - * description:Branch logic is successfully done at phase one. - */ + // The Phase one done. + // description:Branch logic is successfully done at phase one. PhaseOneDone = 2; - /** - * The Phase one failed. - * description:Branch logic is failed at phase one. - */ + // The Phase one failed. + // description:Branch logic is failed at phase one. PhaseOneFailed = 3; - /** - * The Phase one timeout. - * description:Branch logic is NOT reported for a timeout. - */ + // The Phase one timeout. + // description:Branch logic is NOT reported for a timeout. PhaseOneTimeout = 4; - /** - * The Phase two committed. - * description:Commit logic is successfully done at phase two. - */ + // The Phase two committed. + // description:Commit logic is successfully done at phase two. PhaseTwoCommitted = 5; - /** - * The Phase two commit failed retryable. - * description:Commit logic is failed but retryable. - */ + // The Phase two commit failed retryable. + // description:Commit logic is failed but retryable. PhaseTwoCommitFailedRetryable = 6; - /** - * The Phase two commit failed and can not retry. - * description:Commit logic is failed and NOT retryable. - */ + // The Phase two commit failed and can not retry. + // description:Commit logic is failed and NOT retryable. PhaseTwoCommitFailedCanNotRetry = 7; - /** - * The Phase two rollback completed. - * description:Rollback logic is successfully done at phase two. - */ + // The Phase two rollback completed. + // description:Rollback logic is successfully done at phase two. PhaseTwoRolledBack = 8; - /** - * The Phase two rollback failed retryable. - * description:Rollback logic is failed but retryable. - */ + // The Phase two rollback failed retryable. + // description:Rollback logic is failed but retryable. PhaseTwoRollbackFailedRetryable = 9; - /** - * The Phase two rollback failed and can not retry. - * description:Rollback logic is failed but NOT retryable. - */ + // The Phase two rollback failed and can not retry. + // description:Rollback logic is failed but NOT retryable. PhaseTwoRollbackFailedCanNotRetry = 10; } @@ -311,14 +227,14 @@ message RowLock { string RowKey = 7 [(gogoproto.moretags) = "xorm:\"row_key\""]; } -/* GlobalBeginRequest represents a global transaction begin */ +// GlobalBeginRequest represents a global transaction begin message GlobalBeginRequest { string Addressing = 1; int32 Timeout = 2; string TransactionName = 3; } -/* GlobalBeginResponse represents a response to GlobalBeginRequest */ +// GlobalBeginResponse represents a response to GlobalBeginRequest message GlobalBeginResponse { ResultCode ResultCode = 1; ExceptionCode ExceptionCode = 2; @@ -326,7 +242,7 @@ message GlobalBeginResponse { string XID = 4; } -/* BranchRegisterRequest represents a branch transaction join in the global transaction */ +// BranchRegisterRequest represents a branch transaction join in the global transaction message BranchRegisterRequest { string Addressing = 1; string XID = 2; @@ -336,7 +252,7 @@ message BranchRegisterRequest { bytes ApplicationData = 6; } -/* BranchRegisterResponse represents a response to BranchRegisterRequest */ +// BranchRegisterResponse represents a response to BranchRegisterRequest message BranchRegisterResponse { ResultCode ResultCode = 1; ExceptionCode ExceptionCode = 2; @@ -344,7 +260,7 @@ message BranchRegisterResponse { int64 BranchID = 4; } -/* BranchReportRequest represents a request to report branch transaction execution status */ +// BranchReportRequest represents a request to report branch transaction execution status message BranchReportRequest { string XID = 1; int64 BranchID = 2; @@ -354,14 +270,14 @@ message BranchReportRequest { bytes ApplicationData = 6; } -/* BranchReportResponse represents a response to BranchReportRequest */ +// BranchReportResponse represents a response to BranchReportRequest message BranchReportResponse { ResultCode ResultCode = 1; ExceptionCode ExceptionCode = 2; string Message = 3; } -/* GlobalLockQueryRequest represents a request to query the global lock */ +// GlobalLockQueryRequest represents a request to query the global lock message GlobalLockQueryRequest { string XID = 1; string ResourceID = 2; @@ -369,7 +285,7 @@ message GlobalLockQueryRequest { BranchSession.BranchType BranchType = 4; } -/* GlobalLockQueryResponse represents a response to GlobalLockQueryRequest */ +// GlobalLockQueryResponse represents a response to GlobalLockQueryRequest message GlobalLockQueryResponse { ResultCode ResultCode = 1; ExceptionCode ExceptionCode = 2; @@ -377,12 +293,12 @@ message GlobalLockQueryResponse { bool Lockable = 4; } -/* GlobalStatusRequest represents a request to query the global transaction status */ +// GlobalStatusRequest represents a request to query the global transaction status message GlobalStatusRequest { string XID = 1; } -/* GlobalStatusResponse represents a response to GlobalStatusRequest */ +// GlobalStatusResponse represents a response to GlobalStatusRequest message GlobalStatusResponse { ResultCode ResultCode = 1; ExceptionCode ExceptionCode = 2; @@ -390,12 +306,12 @@ message GlobalStatusResponse { GlobalSession.GlobalStatus GlobalStatus = 4; } -/* GlobalCommitRequest represents a request to commit global transaction */ +// GlobalCommitRequest represents a request to commit global transaction message GlobalCommitRequest { string XID = 1; } -/* GlobalCommitResponse represents a response to GlobalCommitRequest */ +// GlobalCommitResponse represents a response to GlobalCommitRequest message GlobalCommitResponse { ResultCode ResultCode = 1; ExceptionCode ExceptionCode = 2; @@ -403,12 +319,12 @@ message GlobalCommitResponse { GlobalSession.GlobalStatus GlobalStatus = 4; } -/* GlobalRollbackRequest represents a request to rollback global transaction */ +// GlobalRollbackRequest represents a request to rollback global transaction message GlobalRollbackRequest { string XID = 1; } -/* GlobalRollbackResponse represents a response to GlobalRollbackRequest */ +// GlobalRollbackResponse represents a response to GlobalRollbackRequest message GlobalRollbackResponse { ResultCode ResultCode = 1; ExceptionCode ExceptionCode = 2; @@ -416,13 +332,13 @@ message GlobalRollbackResponse { GlobalSession.GlobalStatus GlobalStatus = 4; } -/* GlobalReportRequest represents a request to report global transaction execution status */ +// GlobalReportRequest represents a request to report global transaction execution status message GlobalReportRequest { string XID = 1; GlobalSession.GlobalStatus GlobalStatus = 2; } -/* GlobalReportResponse represents a response to GlobalReportRequest */ +// GlobalReportResponse represents a response to GlobalReportRequest message GlobalReportResponse { ResultCode ResultCode = 1; ExceptionCode ExceptionCode = 2; @@ -430,7 +346,7 @@ message GlobalReportResponse { GlobalSession.GlobalStatus GlobalStatus = 4; } -/* BranchCommitRequest represents a request to commit branch transaction */ +// BranchCommitRequest represents a request to commit branch transaction message BranchCommitRequest { string XID = 1; int64 BranchID = 2; @@ -440,7 +356,7 @@ message BranchCommitRequest { bytes ApplicationData = 6; } -/* BranchCommitResponse represents a response to BranchCommitRequest */ +// BranchCommitResponse represents a response to BranchCommitRequest message BranchCommitResponse { ResultCode ResultCode = 1; ExceptionCode ExceptionCode = 2; @@ -450,7 +366,7 @@ message BranchCommitResponse { BranchSession.BranchStatus BranchStatus = 6; } -/* BranchCommitRequest represents a request to rollback branch transaction */ +// BranchCommitRequest represents a request to rollback branch transaction message BranchRollbackRequest { string XID = 1; int64 BranchID = 2; @@ -460,7 +376,7 @@ message BranchRollbackRequest { bytes ApplicationData = 6; } -/* BranchRollbackResponse represents a response to BranchRollbackRequest */ +// BranchRollbackResponse represents a response to BranchRollbackRequest message BranchRollbackResponse { ResultCode ResultCode = 1; ExceptionCode ExceptionCode = 2; @@ -470,6 +386,12 @@ message BranchRollbackResponse { BranchSession.BranchStatus BranchStatus = 6; } +message BranchMessage { + int64 ID = 1; + BranchMessageType BranchMessageType = 2; + google.protobuf.Any Message = 3; +} + service TransactionManagerService { rpc Begin(GlobalBeginRequest) returns (GlobalBeginResponse); rpc GetStatus(GlobalStatusRequest) returns (GlobalStatusResponse); @@ -479,15 +401,11 @@ service TransactionManagerService { } service ResourceManagerService { + rpc BranchCommunicate(stream BranchMessage) returns (stream BranchMessage); rpc BranchRegister(BranchRegisterRequest) returns (BranchRegisterResponse); rpc BranchReport(BranchReportRequest) returns (BranchReportResponse); rpc LockQuery(GlobalLockQueryRequest) returns (GlobalLockQueryResponse); } -service BranchTransactionService { - rpc BranchCommit(BranchCommitRequest) returns (BranchCommitResponse); - rpc BranchRollback(BranchRollbackRequest) returns (BranchRollbackResponse); -} - diff --git a/pkg/apis/seata_grpc.pb.go b/pkg/apis/seata_grpc.pb.go index ff774f1d..e83920c6 100644 --- a/pkg/apis/seata_grpc.pb.go +++ b/pkg/apis/seata_grpc.pb.go @@ -246,6 +246,7 @@ var TransactionManagerService_ServiceDesc = grpc.ServiceDesc{ // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type ResourceManagerServiceClient interface { + BranchCommunicate(ctx context.Context, opts ...grpc.CallOption) (ResourceManagerService_BranchCommunicateClient, error) BranchRegister(ctx context.Context, in *BranchRegisterRequest, opts ...grpc.CallOption) (*BranchRegisterResponse, error) BranchReport(ctx context.Context, in *BranchReportRequest, opts ...grpc.CallOption) (*BranchReportResponse, error) LockQuery(ctx context.Context, in *GlobalLockQueryRequest, opts ...grpc.CallOption) (*GlobalLockQueryResponse, error) @@ -259,6 +260,37 @@ func NewResourceManagerServiceClient(cc grpc.ClientConnInterface) ResourceManage return &resourceManagerServiceClient{cc} } +func (c *resourceManagerServiceClient) BranchCommunicate(ctx context.Context, opts ...grpc.CallOption) (ResourceManagerService_BranchCommunicateClient, error) { + stream, err := c.cc.NewStream(ctx, &ResourceManagerService_ServiceDesc.Streams[0], "/apis.ResourceManagerService/BranchCommunicate", opts...) + if err != nil { + return nil, err + } + x := &resourceManagerServiceBranchCommunicateClient{stream} + return x, nil +} + +type ResourceManagerService_BranchCommunicateClient interface { + Send(*BranchMessage) error + Recv() (*BranchMessage, error) + grpc.ClientStream +} + +type resourceManagerServiceBranchCommunicateClient struct { + grpc.ClientStream +} + +func (x *resourceManagerServiceBranchCommunicateClient) Send(m *BranchMessage) error { + return x.ClientStream.SendMsg(m) +} + +func (x *resourceManagerServiceBranchCommunicateClient) Recv() (*BranchMessage, error) { + m := new(BranchMessage) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + func (c *resourceManagerServiceClient) BranchRegister(ctx context.Context, in *BranchRegisterRequest, opts ...grpc.CallOption) (*BranchRegisterResponse, error) { out := new(BranchRegisterResponse) err := c.cc.Invoke(ctx, "/apis.ResourceManagerService/BranchRegister", in, out, opts...) @@ -290,6 +322,7 @@ func (c *resourceManagerServiceClient) LockQuery(ctx context.Context, in *Global // All implementations should embed UnimplementedResourceManagerServiceServer // for forward compatibility type ResourceManagerServiceServer interface { + BranchCommunicate(ResourceManagerService_BranchCommunicateServer) error BranchRegister(context.Context, *BranchRegisterRequest) (*BranchRegisterResponse, error) BranchReport(context.Context, *BranchReportRequest) (*BranchReportResponse, error) LockQuery(context.Context, *GlobalLockQueryRequest) (*GlobalLockQueryResponse, error) @@ -299,6 +332,9 @@ type ResourceManagerServiceServer interface { type UnimplementedResourceManagerServiceServer struct { } +func (UnimplementedResourceManagerServiceServer) BranchCommunicate(ResourceManagerService_BranchCommunicateServer) error { + return status.Errorf(codes.Unimplemented, "method BranchCommunicate not implemented") +} func (UnimplementedResourceManagerServiceServer) BranchRegister(context.Context, *BranchRegisterRequest) (*BranchRegisterResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method BranchRegister not implemented") } @@ -320,6 +356,32 @@ func RegisterResourceManagerServiceServer(s grpc.ServiceRegistrar, srv ResourceM s.RegisterService(&ResourceManagerService_ServiceDesc, srv) } +func _ResourceManagerService_BranchCommunicate_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(ResourceManagerServiceServer).BranchCommunicate(&resourceManagerServiceBranchCommunicateServer{stream}) +} + +type ResourceManagerService_BranchCommunicateServer interface { + Send(*BranchMessage) error + Recv() (*BranchMessage, error) + grpc.ServerStream +} + +type resourceManagerServiceBranchCommunicateServer struct { + grpc.ServerStream +} + +func (x *resourceManagerServiceBranchCommunicateServer) Send(m *BranchMessage) error { + return x.ServerStream.SendMsg(m) +} + +func (x *resourceManagerServiceBranchCommunicateServer) Recv() (*BranchMessage, error) { + m := new(BranchMessage) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + func _ResourceManagerService_BranchRegister_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(BranchRegisterRequest) if err := dec(in); err != nil { @@ -394,126 +456,13 @@ var ResourceManagerService_ServiceDesc = grpc.ServiceDesc{ Handler: _ResourceManagerService_LockQuery_Handler, }, }, - Streams: []grpc.StreamDesc{}, - Metadata: "seata.proto", -} - -// BranchTransactionServiceClient is the client API for BranchTransactionService service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type BranchTransactionServiceClient interface { - BranchCommit(ctx context.Context, in *BranchCommitRequest, opts ...grpc.CallOption) (*BranchCommitResponse, error) - BranchRollback(ctx context.Context, in *BranchRollbackRequest, opts ...grpc.CallOption) (*BranchRollbackResponse, error) -} - -type branchTransactionServiceClient struct { - cc grpc.ClientConnInterface -} - -func NewBranchTransactionServiceClient(cc grpc.ClientConnInterface) BranchTransactionServiceClient { - return &branchTransactionServiceClient{cc} -} - -func (c *branchTransactionServiceClient) BranchCommit(ctx context.Context, in *BranchCommitRequest, opts ...grpc.CallOption) (*BranchCommitResponse, error) { - out := new(BranchCommitResponse) - err := c.cc.Invoke(ctx, "/apis.BranchTransactionService/BranchCommit", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *branchTransactionServiceClient) BranchRollback(ctx context.Context, in *BranchRollbackRequest, opts ...grpc.CallOption) (*BranchRollbackResponse, error) { - out := new(BranchRollbackResponse) - err := c.cc.Invoke(ctx, "/apis.BranchTransactionService/BranchRollback", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// BranchTransactionServiceServer is the server API for BranchTransactionService service. -// All implementations should embed UnimplementedBranchTransactionServiceServer -// for forward compatibility -type BranchTransactionServiceServer interface { - BranchCommit(context.Context, *BranchCommitRequest) (*BranchCommitResponse, error) - BranchRollback(context.Context, *BranchRollbackRequest) (*BranchRollbackResponse, error) -} - -// UnimplementedBranchTransactionServiceServer should be embedded to have forward compatible implementations. -type UnimplementedBranchTransactionServiceServer struct { -} - -func (UnimplementedBranchTransactionServiceServer) BranchCommit(context.Context, *BranchCommitRequest) (*BranchCommitResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method BranchCommit not implemented") -} -func (UnimplementedBranchTransactionServiceServer) BranchRollback(context.Context, *BranchRollbackRequest) (*BranchRollbackResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method BranchRollback not implemented") -} - -// UnsafeBranchTransactionServiceServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to BranchTransactionServiceServer will -// result in compilation errors. -type UnsafeBranchTransactionServiceServer interface { - mustEmbedUnimplementedBranchTransactionServiceServer() -} - -func RegisterBranchTransactionServiceServer(s grpc.ServiceRegistrar, srv BranchTransactionServiceServer) { - s.RegisterService(&BranchTransactionService_ServiceDesc, srv) -} - -func _BranchTransactionService_BranchCommit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(BranchCommitRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(BranchTransactionServiceServer).BranchCommit(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/apis.BranchTransactionService/BranchCommit", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(BranchTransactionServiceServer).BranchCommit(ctx, req.(*BranchCommitRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _BranchTransactionService_BranchRollback_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(BranchRollbackRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(BranchTransactionServiceServer).BranchRollback(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/apis.BranchTransactionService/BranchRollback", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(BranchTransactionServiceServer).BranchRollback(ctx, req.(*BranchRollbackRequest)) - } - return interceptor(ctx, in, info, handler) -} - -// BranchTransactionService_ServiceDesc is the grpc.ServiceDesc for BranchTransactionService service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var BranchTransactionService_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "apis.BranchTransactionService", - HandlerType: (*BranchTransactionServiceServer)(nil), - Methods: []grpc.MethodDesc{ + Streams: []grpc.StreamDesc{ { - MethodName: "BranchCommit", - Handler: _BranchTransactionService_BranchCommit_Handler, - }, - { - MethodName: "BranchRollback", - Handler: _BranchTransactionService_BranchRollback_Handler, + StreamName: "BranchCommunicate", + Handler: _ResourceManagerService_BranchCommunicate_Handler, + ServerStreams: true, + ClientStreams: true, }, }, - Streams: []grpc.StreamDesc{}, Metadata: "seata.proto", } diff --git a/pkg/client/base/context/root_context.go b/pkg/client/base/context/root_context.go index f15c3d15..e251e214 100644 --- a/pkg/client/base/context/root_context.go +++ b/pkg/client/base/context/root_context.go @@ -30,9 +30,9 @@ func NewRootContext(ctx context.Context) *RootContext { localMap: make(map[string]interface{}), } - kXID := ctx.Value(KeyXID) - if kXID != nil { - xid := kXID.(string) + xID := ctx.Value(KeyXID) + if xID != nil { + xid := xID.(string) rootCtx.Bind(xid) } return rootCtx diff --git a/pkg/client/client.go b/pkg/client/client.go index 24bf55bf..466f6b3b 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -1,9 +1,7 @@ package client import ( - "fmt" "log" - "net" "google.golang.org/grpc" @@ -12,7 +10,6 @@ import ( "github.com/opentrx/seata-golang/v2/pkg/client/rm" "github.com/opentrx/seata-golang/v2/pkg/client/tcc" "github.com/opentrx/seata-golang/v2/pkg/client/tm" - "github.com/opentrx/seata-golang/v2/pkg/util/runtime" ) // Init init resource manager,init transaction manager, expose a port to listen tc @@ -31,19 +28,4 @@ func Init(config *config.Configuration) { rm.InitResourceManager(config.Addressing, resourceManagerClient) tm.InitTransactionManager(config.Addressing, transactionManagerClient) rm.RegisterTransactionServiceServer(tcc.GetTCCResourceManager()) - - lis, err := net.Listen("tcp", fmt.Sprintf(":%v", config.Port)) - if err != nil { - log.Fatalf("failed to listen: %v", err) - } - - s := grpc.NewServer(grpc.KeepaliveEnforcementPolicy(config.GetEnforcementPolicy()), - grpc.KeepaliveParams(config.GetServerParameters())) - apis.RegisterBranchTransactionServiceServer(s, rm.GetResourceManager()) - - runtime.GoWithRecover(func() { - if err := s.Serve(lis); err != nil { - log.Fatalf("failed to serve: %v", err) - } - }, nil) } diff --git a/pkg/client/config/configuration.go b/pkg/client/config/configuration.go index 62666063..0197fe67 100644 --- a/pkg/client/config/configuration.go +++ b/pkg/client/config/configuration.go @@ -16,7 +16,6 @@ var configuration *Configuration // Configuration client configuration type Configuration struct { - Port int32 `yaml:"port" json:"port"` Addressing string `yaml:"addressing" json:"addressing"` ServerAddressing string `yaml:"serverAddressing" json:"serverAddressing"` @@ -24,19 +23,6 @@ type Configuration struct { ATConfig ATConfig `yaml:"at" json:"at,omitempty"` - EnforcementPolicy struct { - MinTime time.Duration `yaml:"minTime"` - PermitWithoutStream bool `yaml:"permitWithoutStream"` - } `yaml:"enforcementPolicy"` - - ServerParameters struct { - MaxConnectionIdle time.Duration `yaml:"maxConnectionIdle"` - MaxConnectionAge time.Duration `yaml:"maxConnectionAge"` - MaxConnectionAgeGrace time.Duration `yaml:"maxConnectionAgeGrace"` - Time time.Duration `yaml:"time"` - Timeout time.Duration `yaml:"timeout"` - } `yaml:"serverParameters"` - ClientParameters struct { Time time.Duration `yaml:"time"` Timeout time.Duration `yaml:"timeout"` @@ -44,8 +30,8 @@ type Configuration struct { } `yaml:"clientParameters"` Log struct { - LogPath string `yaml:"logPath"` - LogLevel log.LogLevel `yaml:"logLevel"` + LogPath string `yaml:"logPath"` + LogLevel log.Level `yaml:"logLevel"` } `yaml:"log"` } @@ -74,61 +60,11 @@ func GetATConfig() ATConfig { return configuration.ATConfig } -// GetEnforcementPolicy used to config grpc connection keep alive -func GetEnforcementPolicy() keepalive.EnforcementPolicy { - return configuration.GetEnforcementPolicy() -} - -// GetServerParameters used to config grpc connection keep alive -func GetServerParameters() keepalive.ServerParameters { - return configuration.GetServerParameters() -} - // GetClientParameters used to config grpc connection keep alive func GetClientParameters() keepalive.ClientParameters { return configuration.GetClientParameters() } -// GetEnforcementPolicy used to config grpc connection keep alive -func (configuration *Configuration) GetEnforcementPolicy() keepalive.EnforcementPolicy { - ep := keepalive.EnforcementPolicy{ - MinTime: 5 * time.Second, - PermitWithoutStream: true, - } - if configuration.EnforcementPolicy.MinTime > 0 { - ep.MinTime = configuration.EnforcementPolicy.MinTime - } - ep.PermitWithoutStream = configuration.EnforcementPolicy.PermitWithoutStream - return ep -} - -// GetServerParameters used to config grpc connection keep alive -func (configuration *Configuration) GetServerParameters() keepalive.ServerParameters { - sp := keepalive.ServerParameters{ - MaxConnectionIdle: 15 * time.Second, - MaxConnectionAge: 30 * time.Second, - MaxConnectionAgeGrace: 5 * time.Second, - Time: 5 * time.Second, - Timeout: time.Second, - } - if configuration.ServerParameters.MaxConnectionIdle > 0 { - sp.MaxConnectionIdle = configuration.ServerParameters.MaxConnectionIdle - } - if configuration.ServerParameters.MaxConnectionAge > 0 { - sp.MaxConnectionAge = configuration.ServerParameters.MaxConnectionAge - } - if configuration.ServerParameters.MaxConnectionAgeGrace > 0 { - sp.MaxConnectionAgeGrace = configuration.ServerParameters.MaxConnectionAgeGrace - } - if configuration.ServerParameters.Time > 0 { - sp.Time = configuration.ServerParameters.Time - } - if configuration.ServerParameters.Timeout > 0 { - sp.Timeout = configuration.ServerParameters.Timeout - } - return sp -} - // GetClientParameters used to config grpc connection keep alive func (configuration *Configuration) GetClientParameters() keepalive.ClientParameters { cp := keepalive.ClientParameters{ @@ -176,13 +112,18 @@ func InitConfiguration(configurationPath string) *Configuration { log.Fatalf("open configuration file fail, %v", err) } - defer fp.Close() - config, err := parse(fp) if err != nil { log.Fatalf("error parsing %s: %v", configurationPath, err) } + defer func() { + err = fp.Close() + if err != nil { + log.Error(err) + } + }() + configuration = config return configuration } diff --git a/pkg/client/proxy/service.go b/pkg/client/proxy/service.go index 388d893f..d657a001 100644 --- a/pkg/client/proxy/service.go +++ b/pkg/client/proxy/service.go @@ -12,10 +12,6 @@ import ( ) var ( - // Precompute the reflect type for error. Can't use error directly - // because Typeof takes an empty interface value. This is annoying. - typeOfError = reflect.TypeOf((*error)(nil)).Elem() - // serviceDescriptorMap, string -> *ServiceDescriptor serviceDescriptorMap = sync.Map{} ) @@ -36,7 +32,7 @@ type ServiceDescriptor struct { Name string ReflectType reflect.Type ReflectValue reflect.Value - Methods sync.Map //string -> *MethodDescriptor + Methods sync.Map // string -> *MethodDescriptor } // Register @@ -144,7 +140,7 @@ func Invoke(methodDesc *MethodDescriptor, ctx *ctx.RootContext, args []interface for i := 0; i < len(args); i++ { t := reflect.ValueOf(args[i]) if methodDesc.ArgsType[i].String() == "context.Context" { - t = SuiteContext(methodDesc, ctx) + t = SuiteContext(ctx, methodDesc) } if !t.IsValid() { at := methodDesc.ArgsType[i] @@ -161,7 +157,7 @@ func Invoke(methodDesc *MethodDescriptor, ctx *ctx.RootContext, args []interface return returnValues } -func SuiteContext(methodDesc *MethodDescriptor, ctx context.Context) reflect.Value { +func SuiteContext(ctx context.Context, methodDesc *MethodDescriptor) reflect.Value { if contextValue := reflect.ValueOf(ctx); contextValue.IsValid() { return contextValue } diff --git a/pkg/client/rm/resource_manager.go b/pkg/client/rm/resource_manager.go index f5a12e91..50d76d05 100644 --- a/pkg/client/rm/resource_manager.go +++ b/pkg/client/rm/resource_manager.go @@ -3,51 +3,64 @@ package rm import ( "context" "fmt" + "io" + + "github.com/gogo/protobuf/types" "github.com/opentrx/seata-golang/v2/pkg/apis" "github.com/opentrx/seata-golang/v2/pkg/client/base/exception" "github.com/opentrx/seata-golang/v2/pkg/client/base/model" + "github.com/opentrx/seata-golang/v2/pkg/util/log" + "github.com/opentrx/seata-golang/v2/pkg/util/runtime" + "google.golang.org/grpc/metadata" ) var defaultResourceManager *ResourceManager type ResourceManagerOutbound interface { - // Branch register long. + // BranchRegister register branch transaction. BranchRegister(ctx context.Context, xid string, resourceID string, branchType apis.BranchSession_BranchType, applicationData []byte, lockKeys string) (int64, error) - // Branch report. + // BranchReport report branch transaction status. BranchReport(ctx context.Context, xid string, branchID int64, branchType apis.BranchSession_BranchType, status apis.BranchSession_BranchStatus, applicationData []byte) error - // Lock query boolean. + // LockQuery lock resource by lockKeys. LockQuery(ctx context.Context, xid string, resourceID string, branchType apis.BranchSession_BranchType, lockKeys string) (bool, error) } type ResourceManagerInterface interface { - apis.BranchTransactionServiceServer + BranchCommit(ctx context.Context, request *apis.BranchCommitRequest) (*apis.BranchCommitResponse, error) + + BranchRollback(ctx context.Context, request *apis.BranchRollbackRequest) (*apis.BranchRollbackResponse, error) - // Register a Resource to be managed by Resource Manager. + // RegisterResource Register a Resource to be managed by Resource Manager. RegisterResource(resource model.Resource) - // Unregister a Resource from the Resource Manager. + // UnregisterResource Unregister a Resource from the Resource Manager. UnregisterResource(resource model.Resource) - // Get the BranchType. + // GetBranchType ... GetBranchType() apis.BranchSession_BranchType } type ResourceManager struct { - addressing string - rpcClient apis.ResourceManagerServiceClient - managers map[apis.BranchSession_BranchType]ResourceManagerInterface + addressing string + rpcClient apis.ResourceManagerServiceClient + managers map[apis.BranchSession_BranchType]ResourceManagerInterface + branchMessages chan *apis.BranchMessage } func InitResourceManager(addressing string, client apis.ResourceManagerServiceClient) { defaultResourceManager = &ResourceManager{ - addressing: addressing, - rpcClient: client, - managers: make(map[apis.BranchSession_BranchType]ResourceManagerInterface), + addressing: addressing, + rpcClient: client, + managers: make(map[apis.BranchSession_BranchType]ResourceManagerInterface), + branchMessages: make(chan *apis.BranchMessage), } + runtime.GoWithRecover(func() { + defaultResourceManager.branchCommunicate() + }, nil) } func RegisterTransactionServiceServer(rm ResourceManagerInterface) { @@ -58,6 +71,91 @@ func GetResourceManager() *ResourceManager { return defaultResourceManager } +func (manager *ResourceManager) branchCommunicate() { + for { + ctx := metadata.AppendToOutgoingContext(context.Background(), "addressing", manager.addressing) + stream, err := manager.rpcClient.BranchCommunicate(ctx) + if err != nil { + continue + } + + done := make(chan bool) + runtime.GoWithRecover(func() { + for { + select { + case _, ok := <-done: + if !ok { + return + } + case msg := <-manager.branchMessages: + err := stream.Send(msg) + if err != nil { + return + } + default: + continue + } + } + }, nil) + + for { + msg, err := stream.Recv() + if err == io.EOF { + close(done) + break + } + if err != nil { + close(done) + break + } + switch msg.BranchMessageType { + case apis.TypeBranchCommit: + request := &apis.BranchCommitRequest{} + data := msg.GetMessage().GetValue() + err := request.Unmarshal(data) + if err != nil { + log.Error(err) + continue + } + response, err := manager.BranchCommit(context.Background(), request) + if err == nil { + content, err := types.MarshalAny(response) + if err == nil { + manager.branchMessages <- &apis.BranchMessage{ + ID: msg.ID, + BranchMessageType: apis.TypeBranchCommitResult, + Message: content, + } + } + } + case apis.TypeBranchRollback: + request := &apis.BranchRollbackRequest{} + data := msg.GetMessage().GetValue() + err := request.Unmarshal(data) + if err != nil { + log.Error(err) + continue + } + response, err := manager.BranchRollback(context.Background(), request) + if err == nil { + content, err := types.MarshalAny(response) + if err == nil { + manager.branchMessages <- &apis.BranchMessage{ + ID: msg.ID, + BranchMessageType: apis.TypeBranchRollBackResult, + Message: content, + } + } + } + } + } + err = stream.CloseSend() + if err != nil { + log.Error(err) + } + } +} + func (manager *ResourceManager) BranchRegister(ctx context.Context, xid string, resourceID string, branchType apis.BranchSession_BranchType, applicationData []byte, lockKeys string) (int64, error) { request := &apis.BranchRegisterRequest{ @@ -74,11 +172,10 @@ func (manager *ResourceManager) BranchRegister(ctx context.Context, xid string, } if resp.ResultCode == apis.ResultCodeSuccess { return resp.BranchID, nil - } else { - return 0, &exception.TransactionException{ - Code: resp.GetExceptionCode(), - Message: resp.GetMessage(), - } + } + return 0, &exception.TransactionException{ + Code: resp.GetExceptionCode(), + Message: resp.GetMessage(), } } @@ -119,11 +216,10 @@ func (manager *ResourceManager) LockQuery(ctx context.Context, xid string, resou } if resp.ResultCode == apis.ResultCodeSuccess { return resp.Lockable, nil - } else { - return false, &exception.TransactionException{ - Code: resp.GetExceptionCode(), - Message: resp.GetMessage(), - } + } + return false, &exception.TransactionException{ + Code: resp.GetExceptionCode(), + Message: resp.GetMessage(), } } diff --git a/pkg/client/tcc/proxy.go b/pkg/client/tcc/proxy.go index 318cc419..36196381 100644 --- a/pkg/client/tcc/proxy.go +++ b/pkg/client/tcc/proxy.go @@ -2,36 +2,36 @@ package tcc import ( "encoding/json" - "github.com/opentrx/seata-golang/v2/pkg/apis" - "github.com/opentrx/seata-golang/v2/pkg/client/rm" "reflect" "strconv" gxnet "github.com/dubbogo/gost/net" "github.com/pkg/errors" + "github.com/opentrx/seata-golang/v2/pkg/apis" ctx "github.com/opentrx/seata-golang/v2/pkg/client/base/context" "github.com/opentrx/seata-golang/v2/pkg/client/proxy" + "github.com/opentrx/seata-golang/v2/pkg/client/rm" "github.com/opentrx/seata-golang/v2/pkg/util/log" "github.com/opentrx/seata-golang/v2/pkg/util/time" ) var ( - TCC_ACTION_NAME = "TccActionName" + TccActionName = "TccActionName" - TRY_METHOD = "Try" - CONFIRM_METHOD = "Confirm" - CANCEL_METHOD = "Cancel" + TryMethod = "Try" + ConfirmMethod = "Confirm" + CancelMethod = "Cancel" - ACTION_START_TIME = "action-start-time" - ACTION_NAME = "actionName" - PREPARE_METHOD = "sys::prepare" - COMMIT_METHOD = "sys::commit" - ROLLBACK_METHOD = "sys::rollback" - HOST_NAME = "host-name" + ActionStartTime = "action-start-time" + ActionName = "actionName" + PrepareMethod = "sys::prepare" + CommitMethod = "sys::commit" + RollbackMethod = "sys::rollback" + HostName = "host-name" - TCC_METHOD_ARGUMENTS = "arguments" - TCC_METHOD_RESULT = "result" + TccMethodArguments = "arguments" + TccMethodResult = "result" businessActionContextType = reflect.TypeOf(&ctx.BusinessActionContext{}) ) @@ -82,26 +82,26 @@ func ImplementTCC(v TccProxyService) { t := typeOf.Field(i) methodName := t.Name f := valueOfElem.Field(i) - if f.Kind() == reflect.Func && f.IsValid() && f.CanSet() && methodName == TRY_METHOD { + if f.Kind() == reflect.Func && f.IsValid() && f.CanSet() && methodName == TryMethod { if t.Type.NumIn() != 1 && t.Type.In(0) != businessActionContextType { panic("prepare method argument is not BusinessActionContext") } - actionName := t.Tag.Get(TCC_ACTION_NAME) + actionName := t.Tag.Get(TccActionName) if actionName == "" { panic("must tag TccActionName") } - commitMethodDesc := proxy.Register(proxyService, CONFIRM_METHOD) - cancelMethodDesc := proxy.Register(proxyService, CANCEL_METHOD) + commitMethodDesc := proxy.Register(proxyService, ConfirmMethod) + cancelMethodDesc := proxy.Register(proxyService, CancelMethod) tryMethodDesc := proxy.Register(proxyService, methodName) tccResource := &TCCResource{ ActionName: actionName, - PrepareMethodName: TRY_METHOD, - CommitMethodName: COMMIT_METHOD, + PrepareMethodName: TryMethod, + CommitMethodName: CommitMethod, CommitMethod: commitMethodDesc, - RollbackMethodName: CANCEL_METHOD, + RollbackMethodName: CancelMethod, RollbackMethod: cancelMethodDesc, } @@ -139,20 +139,20 @@ func proceed(methodDesc *proxy.MethodDescriptor, ctx *ctx.BusinessActionContext, } func doTccActionLogStore(ctx *ctx.BusinessActionContext, resource *TCCResource) (int64, error) { - ctx.ActionContext[ACTION_START_TIME] = time.CurrentTimeMillis() - ctx.ActionContext[PREPARE_METHOD] = resource.PrepareMethodName - ctx.ActionContext[COMMIT_METHOD] = resource.CommitMethodName - ctx.ActionContext[ROLLBACK_METHOD] = resource.RollbackMethodName - ctx.ActionContext[ACTION_NAME] = ctx.ActionName + ctx.ActionContext[ActionStartTime] = time.CurrentTimeMillis() + ctx.ActionContext[PrepareMethod] = resource.PrepareMethodName + ctx.ActionContext[CommitMethod] = resource.CommitMethodName + ctx.ActionContext[RollbackMethod] = resource.RollbackMethodName + ctx.ActionContext[ActionName] = ctx.ActionName ip, err := gxnet.GetLocalIP() if err == nil { - ctx.ActionContext[HOST_NAME] = ip + ctx.ActionContext[HostName] = ip } else { log.Warn("getLocalIP error") } applicationContext := make(map[string]interface{}) - applicationContext[TCC_ACTION_CONTEXT] = ctx.ActionContext + applicationContext[TccActionContext] = ctx.ActionContext applicationData, err := json.Marshal(applicationContext) if err != nil { diff --git a/pkg/client/tcc/tcc_resource_manager.go b/pkg/client/tcc/tcc_resource_manager.go index 4014bb8a..f2dda362 100644 --- a/pkg/client/tcc/tcc_resource_manager.go +++ b/pkg/client/tcc/tcc_resource_manager.go @@ -14,7 +14,7 @@ import ( ) var ( - TCC_ACTION_CONTEXT = "actionContext" + TccActionContext = "actionContext" ) var tccResourceManager TCCResourceManager @@ -55,7 +55,7 @@ func (resourceManager TCCResourceManager) BranchCommit(ctx context.Context, requ args = append(args, businessActionContext) returnValues := proxy.Invoke(tccResource.CommitMethod, nil, args) log.Debugf("TCC resource commit result : %v, xid: %s, branchID: %d, resourceID: %s", returnValues, request.XID, request.BranchID, request.ResourceID) - if returnValues != nil && len(returnValues) == 1 { + if len(returnValues) == 1 { result = returnValues[0].Interface().(bool) } if result { @@ -65,14 +65,13 @@ func (resourceManager TCCResourceManager) BranchCommit(ctx context.Context, requ BranchID: request.BranchID, BranchStatus: apis.PhaseTwoCommitted, }, nil - } else { - return &apis.BranchCommitResponse{ - ResultCode: apis.ResultCodeSuccess, - XID: request.XID, - BranchID: request.BranchID, - BranchStatus: apis.PhaseTwoCommitFailedRetryable, - }, nil } + return &apis.BranchCommitResponse{ + ResultCode: apis.ResultCodeSuccess, + XID: request.XID, + BranchID: request.BranchID, + BranchStatus: apis.PhaseTwoCommitFailedRetryable, + }, nil } func (resourceManager TCCResourceManager) BranchRollback(ctx context.Context, request *apis.BranchRollbackRequest) (*apis.BranchRollbackResponse, error) { @@ -97,7 +96,7 @@ func (resourceManager TCCResourceManager) BranchRollback(ctx context.Context, re args = append(args, businessActionContext) returnValues := proxy.Invoke(tccResource.RollbackMethod, nil, args) log.Debugf("TCC resource rollback result : %v, xid: %s, branchID: %d, resourceID: %s", returnValues, request.XID, request.BranchID, request.ResourceID) - if returnValues != nil && len(returnValues) == 1 { + if len(returnValues) == 1 { result = returnValues[0].Interface().(bool) } if result { @@ -107,14 +106,13 @@ func (resourceManager TCCResourceManager) BranchRollback(ctx context.Context, re BranchID: request.BranchID, BranchStatus: apis.PhaseTwoRolledBack, }, nil - } else { - return &apis.BranchRollbackResponse{ - ResultCode: apis.ResultCodeSuccess, - XID: request.XID, - BranchID: request.BranchID, - BranchStatus: apis.PhaseTwoRollbackFailedRetryable, - }, nil } + return &apis.BranchRollbackResponse{ + ResultCode: apis.ResultCodeSuccess, + XID: request.XID, + BranchID: request.BranchID, + BranchStatus: apis.PhaseTwoRollbackFailedRetryable, + }, nil } func getBusinessActionContext(xid string, branchID int64, resourceID string, applicationData []byte) *ctx.BusinessActionContext { @@ -129,7 +127,7 @@ func getBusinessActionContext(xid string, branchID int64, resourceID string, app } } - acMap := tccContext[TCC_ACTION_CONTEXT] + acMap := tccContext[TccActionContext] if acMap != nil { actionContextMap = acMap.(map[string]interface{}) } diff --git a/pkg/client/tm/global_transaction.go b/pkg/client/tm/global_transaction.go index c7cf15ba..2eb2e75c 100644 --- a/pkg/client/tm/global_transaction.go +++ b/pkg/client/tm/global_transaction.go @@ -12,8 +12,8 @@ import ( ) const ( - DEFAULT_GLOBAL_TX_TIMEOUT = 60000 - DEFAULT_GLOBAL_TX_NAME = "default" + DefaultGlobalTxTimeout = 60000 + DefaultGlobalTxName = "default" ) type SuspendedResourcesHolder struct { @@ -64,11 +64,11 @@ type DefaultGlobalTransaction struct { } func (gtx *DefaultGlobalTransaction) Begin(ctx *ctx.RootContext) error { - return gtx.BeginWithTimeout(DEFAULT_GLOBAL_TX_TIMEOUT, ctx) + return gtx.BeginWithTimeout(DefaultGlobalTxTimeout, ctx) } func (gtx *DefaultGlobalTransaction) BeginWithTimeout(timeout int32, ctx *ctx.RootContext) error { - return gtx.BeginWithTimeoutAndName(timeout, DEFAULT_GLOBAL_TX_NAME, ctx) + return gtx.BeginWithTimeoutAndName(timeout, DefaultGlobalTxName, ctx) } func (gtx *DefaultGlobalTransaction) BeginWithTimeoutAndName(timeout int32, name string, ctx *ctx.RootContext) error { diff --git a/pkg/client/tm/proxy.go b/pkg/client/tm/proxy.go index 98552eef..29643ad1 100644 --- a/pkg/client/tm/proxy.go +++ b/pkg/client/tm/proxy.go @@ -12,8 +12,6 @@ import ( "github.com/opentrx/seata-golang/v2/pkg/util/log" ) -import () - type GlobalTransactionProxyService interface { GetProxyService() interface{} GetMethodTransactionInfo(methodName string) *model.TransactionInfo @@ -40,8 +38,8 @@ func Implement(v GlobalTransactionProxyService) { makeCallProxy := func(methodDesc *proxy.MethodDescriptor, txInfo *model.TransactionInfo) func(in []reflect.Value) []reflect.Value { return func(in []reflect.Value) []reflect.Value { var ( - args = make([]interface{}, 0) - returnValues = make([]reflect.Value, 0) + args []interface{} + returnValues []reflect.Value suspendedResourcesHolder *SuspendedResourcesHolder ) @@ -68,14 +66,17 @@ func Implement(v GlobalTransactionProxyService) { } tx := GetCurrentOrCreate(invCtx) - defer tx.Resume(suspendedResourcesHolder, invCtx) + defer func() { + err := tx.Resume(suspendedResourcesHolder, invCtx) + if err != nil { + log.Error(err) + } + }() switch txInfo.Propagation { case model.Required: - break case model.RequiresNew: suspendedResourcesHolder, _ = tx.Suspend(true, invCtx) - break case model.NotSupported: suspendedResourcesHolder, _ = tx.Suspend(true, invCtx) returnValues = proxy.Invoke(methodDesc, invCtx, args) @@ -85,19 +86,16 @@ func Implement(v GlobalTransactionProxyService) { returnValues = proxy.Invoke(methodDesc, invCtx, args) return returnValues } - break case model.Never: if invCtx.InGlobalTransaction() { return proxy.ReturnWithError(methodDesc, errors.Errorf("Existing transaction found for transaction marked with propagation 'never',xid = %s", invCtx.GetXID())) - } else { - returnValues = proxy.Invoke(methodDesc, invCtx, args) - return returnValues } + returnValues = proxy.Invoke(methodDesc, invCtx, args) + return returnValues case model.Mandatory: if !invCtx.InGlobalTransaction() { return proxy.ReturnWithError(methodDesc, errors.New("No existing transaction found for transaction marked with propagation 'mandatory'")) } - break default: return proxy.ReturnWithError(methodDesc, errors.Errorf("Not Supported Propagation: %s", txInfo.Propagation.String())) } @@ -111,13 +109,13 @@ func Implement(v GlobalTransactionProxyService) { errValue := returnValues[len(returnValues)-1] - //todo 只要出错就回滚,未来可以优化一下,某些错误才回滚,某些错误的情况下,可以提交 + // todo 只要出错就回滚,未来可以优化一下,某些错误才回滚,某些错误的情况下,可以提交 if errValue.IsValid() && !errValue.IsNil() { rollbackErr := tx.Rollback(invCtx) if rollbackErr != nil { return proxy.ReturnWithError(methodDesc, errors.WithStack(rollbackErr)) } - return proxy.ReturnWithError(methodDesc, errors.New("rollback failure")) + return returnValues } commitErr := tx.Commit(invCtx) diff --git a/pkg/client/tm/transaction_manager.go b/pkg/client/tm/transaction_manager.go index 237d53f2..558b0421 100644 --- a/pkg/client/tm/transaction_manager.go +++ b/pkg/client/tm/transaction_manager.go @@ -2,9 +2,9 @@ package tm import ( "context" - "github.com/opentrx/seata-golang/v2/pkg/client/base/exception" "github.com/opentrx/seata-golang/v2/pkg/apis" + "github.com/opentrx/seata-golang/v2/pkg/client/base/exception" ) var defaultTransactionManager *TransactionManager diff --git a/pkg/common/message_future.go b/pkg/common/message_future.go new file mode 100644 index 00000000..86029130 --- /dev/null +++ b/pkg/common/message_future.go @@ -0,0 +1,19 @@ +package common + +import "github.com/opentrx/seata-golang/v2/pkg/apis" + +// MessageFuture ... +type MessageFuture struct { + ID int64 + Err error + Response interface{} + Done chan bool +} + +// NewMessageFuture ... +func NewMessageFuture(message *apis.BranchMessage) *MessageFuture { + return &MessageFuture{ + ID: message.ID, + Done: make(chan bool), + } +} diff --git a/pkg/tc/config/configuration.go b/pkg/tc/config/configuration.go index b192c488..4dac3932 100644 --- a/pkg/tc/config/configuration.go +++ b/pkg/tc/config/configuration.go @@ -29,6 +29,8 @@ type Configuration struct { CommittingRetryPeriod time.Duration `yaml:"committingRetryPeriod"` RollingBackRetryPeriod time.Duration `yaml:"rollingBackRetryPeriod"` TimeoutRetryPeriod time.Duration `yaml:"timeoutRetryPeriod"` + + StreamMessageTimeout time.Duration `yaml:"streamMessageTimeout"` } `yaml:"server"` EnforcementPolicy struct { @@ -44,18 +46,12 @@ type Configuration struct { Timeout time.Duration `yaml:"timeout"` } `yaml:"serverParameters"` - ClientParameters struct { - Time time.Duration `yaml:"time"` - Timeout time.Duration `yaml:"timeout"` - PermitWithoutStream bool `yaml:"permitWithoutStream"` - } `yaml:"clientParameters"` - // Storage is the configuration for the storage driver Storage Storage `yaml:"storage"` Log struct { - LogPath string `yaml:"logPath"` - LogLevel log.LogLevel `yaml:"logLevel"` + LogPath string `yaml:"logPath"` + LogLevel log.Level `yaml:"logLevel"` } `yaml:"log"` } @@ -97,22 +93,6 @@ func (configuration *Configuration) GetServerParameters() keepalive.ServerParame return sp } -func (configuration *Configuration) GetClientParameters() keepalive.ClientParameters { - cp := keepalive.ClientParameters{ - Time: 10 * time.Second, - Timeout: time.Second, - PermitWithoutStream: true, - } - if configuration.ClientParameters.Time > 0 { - cp.Time = configuration.ClientParameters.Timeout - } - if configuration.ClientParameters.Timeout > 0 { - cp.Timeout = configuration.ClientParameters.Timeout - } - cp.PermitWithoutStream = configuration.ClientParameters.PermitWithoutStream - return cp -} - // Parameters defines a key-value parameters mapping type Parameters map[string]interface{} diff --git a/pkg/tc/holder/session_holder.go b/pkg/tc/holder/session_holder.go index fe03eea3..a3dfe800 100644 --- a/pkg/tc/holder/session_holder.go +++ b/pkg/tc/holder/session_holder.go @@ -27,7 +27,7 @@ func (holder *SessionHolder) FindGlobalTransaction(xid string) *model.GlobalTran if globalSession != nil { gt := &model.GlobalTransaction{GlobalSession: globalSession} branchSessions := holder.manager.FindBranchSessions(xid) - if branchSessions != nil && len(branchSessions) != 0 { + if len(branchSessions) != 0 { gt.BranchSessions = make(map[*apis.BranchSession]bool, len(branchSessions)) for i := 0; i < len(branchSessions); i++ { gt.BranchSessions[branchSessions[i]] = true @@ -38,32 +38,42 @@ func (holder *SessionHolder) FindGlobalTransaction(xid string) *model.GlobalTran return nil } -func (holder *SessionHolder) FindAsyncCommittingGlobalTransactions() []*model.GlobalTransaction { - return holder.findGlobalTransactions([]apis.GlobalSession_GlobalStatus{ +func (holder *SessionHolder) FindAsyncCommittingGlobalTransactions(addressingIdentities []string) []*model.GlobalTransaction { + return holder.findGlobalTransactionsWithAddressingIdentities([]apis.GlobalSession_GlobalStatus{ apis.AsyncCommitting, - }) + }, addressingIdentities) } -func (holder *SessionHolder) FindRetryCommittingGlobalTransactions() []*model.GlobalTransaction { - return holder.findGlobalTransactions([]apis.GlobalSession_GlobalStatus{ +func (holder *SessionHolder) FindRetryCommittingGlobalTransactions(addressingIdentities []string) []*model.GlobalTransaction { + return holder.findGlobalTransactionsWithAddressingIdentities([]apis.GlobalSession_GlobalStatus{ apis.CommitRetrying, - }) + }, addressingIdentities) } -func (holder *SessionHolder) FindRetryRollbackGlobalTransactions() []*model.GlobalTransaction { - return holder.findGlobalTransactions([]apis.GlobalSession_GlobalStatus{ +func (holder *SessionHolder) FindRetryRollbackGlobalTransactions(addressingIdentities []string) []*model.GlobalTransaction { + return holder.findGlobalTransactionsWithAddressingIdentities([]apis.GlobalSession_GlobalStatus{ apis.RollingBack, apis.RollbackRetrying, apis.TimeoutRollingBack, apis.TimeoutRollbackRetrying, - }) + }, addressingIdentities) } func (holder *SessionHolder) findGlobalTransactions(statuses []apis.GlobalSession_GlobalStatus) []*model.GlobalTransaction { gts := holder.manager.FindGlobalSessions(statuses) - if gts == nil || len(gts) == 0 { + return holder.findGlobalTransactionsByGlobalSessions(gts) +} + +func (holder *SessionHolder) findGlobalTransactionsWithAddressingIdentities(statuses []apis.GlobalSession_GlobalStatus, + addressingIdentities []string) []*model.GlobalTransaction { + gts := holder.manager.FindGlobalSessionsWithAddressingIdentities(statuses, addressingIdentities) + return holder.findGlobalTransactionsByGlobalSessions(gts) +} + +func (holder *SessionHolder) findGlobalTransactionsByGlobalSessions(sessions []*apis.GlobalSession) []*model.GlobalTransaction { + if len(sessions) == 0 { return nil } - xids := make([]string, 0, len(gts)) - for _, gt := range gts { + xids := make([]string, 0, len(sessions)) + for _, gt := range sessions { xids = append(xids, gt.XID) } branchSessions := holder.manager.FindBatchBranchSessions(xids) @@ -80,15 +90,15 @@ func (holder *SessionHolder) findGlobalTransactions(statuses []apis.GlobalSessio } } - globalTransactions := make([]*model.GlobalTransaction, 0, len(gts)) - for j := 0; j < len(gts); j++ { + globalTransactions := make([]*model.GlobalTransaction, 0, len(sessions)) + for j := 0; j < len(sessions); j++ { globalTransaction := &model.GlobalTransaction{ - GlobalSession: gts[j], - BranchSessions: make(map[*apis.BranchSession]bool, 0), + GlobalSession: sessions[j], + BranchSessions: map[*apis.BranchSession]bool{}, } - branchSessionSlice := branchSessionMap[gts[j].XID] - if branchSessionSlice != nil && len(branchSessionSlice) > 0 { + branchSessionSlice := branchSessionMap[sessions[j].XID] + if len(branchSessionSlice) > 0 { for x := 0; x < len(branchSessionSlice); x++ { globalTransaction.BranchSessions[branchSessionSlice[x]] = true } @@ -99,6 +109,10 @@ func (holder *SessionHolder) findGlobalTransactions(statuses []apis.GlobalSessio return globalTransactions } +func (holder *SessionHolder) FindGlobalSessions(statuses []apis.GlobalSession_GlobalStatus) []*apis.GlobalSession { + return holder.manager.FindGlobalSessions(statuses) +} + func (holder *SessionHolder) AllSessions() []*apis.GlobalSession { return holder.manager.AllSessions() } @@ -118,9 +132,15 @@ func (holder *SessionHolder) RemoveGlobalSession(session *apis.GlobalSession) er } func (holder *SessionHolder) RemoveGlobalTransaction(globalTransaction *model.GlobalTransaction) error { - holder.manager.RemoveGlobalSession(globalTransaction.GlobalSession) + err := holder.manager.RemoveGlobalSession(globalTransaction.GlobalSession) + if err != nil { + return err + } for bs := range globalTransaction.BranchSessions { - holder.manager.RemoveBranchSession(globalTransaction.GlobalSession, bs) + err = holder.manager.RemoveBranchSession(globalTransaction.GlobalSession, bs) + if err != nil { + return err + } } return nil } diff --git a/pkg/tc/lock/lock_manager.go b/pkg/tc/lock/lock_manager.go index 501a2e5c..92172ca1 100644 --- a/pkg/tc/lock/lock_manager.go +++ b/pkg/tc/lock/lock_manager.go @@ -26,7 +26,7 @@ func (locker *LockManager) AcquireLock(branchSession *apis.BranchSession) bool { } locks := storage.CollectBranchSessionRowLocks(branchSession) - if locks == nil || len(locks) == 0 { + if len(locks) == 0 { return true } @@ -44,7 +44,7 @@ func (locker *LockManager) ReleaseLock(branchSession *apis.BranchSession) bool { } locks := storage.CollectBranchSessionRowLocks(branchSession) - if locks == nil || len(locks) == 0 { + if len(locks) == 0 { return true } diff --git a/pkg/tc/metrics/metrics.go b/pkg/tc/metrics/metrics.go index 4f5df5c0..a5bfeaf2 100644 --- a/pkg/tc/metrics/metrics.go +++ b/pkg/tc/metrics/metrics.go @@ -1,57 +1,57 @@ package metrics import ( - "github.com/opentrx/seata-golang/v2/pkg/apis" "sort" "github.com/rcrowley/go-metrics" + "github.com/opentrx/seata-golang/v2/pkg/apis" "github.com/opentrx/seata-golang/v2/pkg/tc/event" "github.com/opentrx/seata-golang/v2/pkg/util/runtime" ) var ( - SEATA_TRANSACTION = "seata.transaction" + SeataTransaction = "seata.transaction" - NAME_KEY = "name" + NameKey = "name" - ROLE_KEY = "role" + RoleKey = "role" - METER_KEY = "meter" + MeterKey = "meter" - STATISTIC_KEY = "statistic" + StatisticKey = "statistic" - STATUS_KEY = "status" + StatusKey = "status" - ROLE_VALUE_TC = "tc" + RoleValueTc = "tc" - ROLE_VALUE_TM = "client" + RoleValueTm = "client" - ROLE_VALUE_RM = "rm" + RoleValueRm = "rm" - METER_VALUE_GAUGE = "gauge" + MeterValueGauge = "gauge" - METER_VALUE_COUNTER = "counter" + MeterValueCounter = "counter" - METER_VALUE_SUMMARY = "summary" + MeterValueSummary = "summary" - METER_VALUE_TIMER = "timer" + MeterValueTimer = "timer" - STATISTIC_VALUE_COUNT = "count" + StatisticValueCount = "count" - STATISTIC_VALUE_TOTAL = "total" + StatisticValueTotal = "total" - STATISTIC_VALUE_TPS = "tps" + StatisticValueTps = "tps" - STATISTIC_VALUE_MAX = "max" + StatisticValueMax = "max" - STATISTIC_VALUE_AVERAGE = "average" + StatisticValueAverage = "average" - STATUS_VALUE_ACTIVE = "active" + StatusValueActive = "active" - STATUS_VALUE_COMMITTED = "committed" + StatusValueCommitted = "committed" - STATUS_VALUE_ROLLBACKED = "rollbacked" + StatusValueRollbacked = "rollbacked" ) type Counter struct { @@ -122,105 +122,98 @@ func sortedLabels(labels map[string]string) (keys, values []string) { } var ( - COUNTER_ACTIVE = &Counter{ + CounterActive = &Counter{ Counter: metrics.NewCounter(), - Name: SEATA_TRANSACTION, + Name: SeataTransaction, Labels: map[string]string{ - ROLE_KEY: ROLE_VALUE_TC, - METER_KEY: METER_VALUE_COUNTER, - STATUS_KEY: STATUS_VALUE_ACTIVE, + RoleKey: RoleValueTc, + MeterKey: MeterValueCounter, + StatusKey: StatusValueActive, }, } - COUNTER_COMMITTED = &Counter{ + CounterCommitted = &Counter{ Counter: metrics.NewCounter(), - Name: SEATA_TRANSACTION, + Name: SeataTransaction, Labels: map[string]string{ - ROLE_KEY: ROLE_VALUE_TC, - METER_KEY: METER_VALUE_COUNTER, - STATUS_KEY: STATUS_VALUE_COMMITTED, + RoleKey: RoleValueTc, + MeterKey: MeterValueCounter, + StatusKey: StatusValueCommitted, }, } - COUNTER_ROLLBACKED = &Counter{ + CounterRollbacked = &Counter{ Counter: metrics.NewCounter(), - Name: SEATA_TRANSACTION, + Name: SeataTransaction, Labels: map[string]string{ - ROLE_KEY: ROLE_VALUE_TC, - METER_KEY: METER_VALUE_COUNTER, - STATUS_KEY: STATUS_VALUE_ROLLBACKED, + RoleKey: RoleValueTc, + MeterKey: MeterValueCounter, + StatusKey: StatusValueRollbacked, }, } - SUMMARY_COMMITTED = &Summary{ + SummaryCommitted = &Summary{ Meter: metrics.NewMeter(), - Name: SEATA_TRANSACTION, + Name: SeataTransaction, Labels: map[string]string{ - ROLE_KEY: ROLE_VALUE_TC, - METER_KEY: METER_VALUE_SUMMARY, - STATUS_KEY: STATUS_VALUE_COMMITTED, + RoleKey: RoleValueTc, + MeterKey: MeterValueSummary, + StatusKey: StatusValueCommitted, }, } - SUMMARY_ROLLBACKED = &Summary{ + SummaryRollbacked = &Summary{ Meter: metrics.NewMeter(), - Name: SEATA_TRANSACTION, + Name: SeataTransaction, Labels: map[string]string{ - ROLE_KEY: ROLE_VALUE_TC, - METER_KEY: METER_VALUE_SUMMARY, - STATUS_KEY: STATUS_VALUE_ROLLBACKED, + RoleKey: RoleValueTc, + MeterKey: MeterValueSummary, + StatusKey: StatusValueRollbacked, }, } - TIMER_COMMITTED = &Histogram{ + TimerCommitted = &Histogram{ Histogram: metrics.NewHistogram(metrics.NewExpDecaySample(1028, 0.015)), - Name: SEATA_TRANSACTION, + Name: SeataTransaction, Labels: map[string]string{ - ROLE_KEY: ROLE_VALUE_TC, - METER_KEY: METER_VALUE_TIMER, - STATUS_KEY: STATUS_VALUE_COMMITTED, + RoleKey: RoleValueTc, + MeterKey: MeterValueTimer, + StatusKey: StatusValueCommitted, }, } - TIMER_ROLLBACK = &Histogram{ + TimerRollback = &Histogram{ Histogram: metrics.NewHistogram(metrics.NewExpDecaySample(1028, 0.015)), - Name: SEATA_TRANSACTION, + Name: SeataTransaction, Labels: map[string]string{ - ROLE_KEY: ROLE_VALUE_TC, - METER_KEY: METER_VALUE_TIMER, - STATUS_KEY: STATUS_VALUE_ROLLBACKED, + RoleKey: RoleValueTc, + MeterKey: MeterValueTimer, + StatusKey: StatusValueRollbacked, }, } ) -type MetricsSubscriber struct { +type Subscriber struct { } -func (subscriber *MetricsSubscriber) ProcessGlobalTransactionEvent() { +func (subscriber *Subscriber) ProcessGlobalTransactionEvent() { for { gtv := <-event.EventBus.GlobalTransactionEventChannel switch gtv.GetStatus() { case apis.Begin: - COUNTER_ACTIVE.Inc(1) - break + CounterActive.Inc(1) case apis.Committed: - COUNTER_ACTIVE.Dec(1) - COUNTER_COMMITTED.Inc(1) - SUMMARY_COMMITTED.Mark(1) - TIMER_COMMITTED.Update(gtv.GetEndTime() - gtv.GetBeginTime()) - break + CounterActive.Dec(1) + CounterCommitted.Inc(1) + SummaryCommitted.Mark(1) + TimerCommitted.Update(gtv.GetEndTime() - gtv.GetBeginTime()) case apis.RolledBack: - COUNTER_ACTIVE.Dec(1) - COUNTER_ROLLBACKED.Inc(1) - SUMMARY_ROLLBACKED.Mark(1) - TIMER_ROLLBACK.Update(gtv.GetEndTime() - gtv.GetBeginTime()) - break + CounterActive.Dec(1) + CounterRollbacked.Inc(1) + SummaryRollbacked.Mark(1) + TimerRollback.Update(gtv.GetEndTime() - gtv.GetBeginTime()) case apis.CommitFailed: - COUNTER_ACTIVE.Dec(1) - break + CounterActive.Dec(1) case apis.RollbackFailed: - COUNTER_ACTIVE.Dec(1) - break + CounterActive.Dec(1) case apis.TimeoutRolledBack: - COUNTER_ACTIVE.Dec(1) - break + CounterActive.Dec(1) case apis.TimeoutRollbackFailed: - COUNTER_ACTIVE.Dec(1) - break + CounterActive.Dec(1) default: break } @@ -228,7 +221,7 @@ func (subscriber *MetricsSubscriber) ProcessGlobalTransactionEvent() { } func init() { - subscriber := &MetricsSubscriber{} + subscriber := &Subscriber{} runtime.GoWithRecover(func() { subscriber.ProcessGlobalTransactionEvent() }, nil) diff --git a/pkg/tc/metrics/promethues_exporter.go b/pkg/tc/metrics/promethues_exporter.go index 25a8f6c2..5f68aee9 100644 --- a/pkg/tc/metrics/promethues_exporter.go +++ b/pkg/tc/metrics/promethues_exporter.go @@ -7,33 +7,37 @@ import ( "strconv" "strings" + "github.com/opentrx/seata-golang/v2/pkg/util/log" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" ) -type promHttpExporter struct { +type promHTTPExporter struct { real http.Handler } -func (exporter *promHttpExporter) ServeHTTP(rsp http.ResponseWriter, req *http.Request) { +func (exporter *promHTTPExporter) ServeHTTP(rsp http.ResponseWriter, req *http.Request) { exporter.real.ServeHTTP(rsp, req) exporter.Flush(rsp) } -func (exporter *promHttpExporter) Flush(writer io.Writer) { +func (exporter *promHTTPExporter) Flush(writer io.Writer) { w := writer var sb strings.Builder tracker := make(map[string]bool) - flushCounter(tracker, &sb, COUNTER_ACTIVE) - flushCounter(tracker, &sb, COUNTER_COMMITTED) - flushCounter(tracker, &sb, COUNTER_ROLLBACKED) + flushCounter(tracker, &sb, CounterActive) + flushCounter(tracker, &sb, CounterCommitted) + flushCounter(tracker, &sb, CounterRollbacked) - flushHistogram(tracker, &sb, TIMER_COMMITTED) - flushHistogram(tracker, &sb, TIMER_ROLLBACK) + flushHistogram(tracker, &sb, TimerCommitted) + flushHistogram(tracker, &sb, TimerRollback) - w.Write([]byte(sb.String())) + _, err := w.Write([]byte(sb.String())) + if err != nil { + log.Error(err) + } } func flushHistogram(tracker map[string]bool, buf *strings.Builder, histogram *Histogram) { @@ -105,7 +109,7 @@ func init() { // export http for prometheus srvMux := http.NewServeMux() - srvMux.Handle("/metrics", &promHttpExporter{ + srvMux.Handle("/metrics", &promHTTPExporter{ real: promhttp.HandlerFor(promReg, promhttp.HandlerOpts{ DisableCompression: true, }), @@ -115,5 +119,10 @@ func init() { Addr: fmt.Sprintf("0.0.0.0:%d", 9898), Handler: srvMux, } - go srv.ListenAndServe() + go func() { + err := srv.ListenAndServe() + if err != nil { + log.Error(err) + } + }() } diff --git a/pkg/tc/model/global_transaction.go b/pkg/tc/model/global_transaction.go index 352970ef..f345445e 100644 --- a/pkg/tc/model/global_transaction.go +++ b/pkg/tc/model/global_transaction.go @@ -42,8 +42,6 @@ func (gt *GlobalTransaction) IsSaga() bool { for branchSession := range gt.BranchSessions { if branchSession.Type == apis.SAGA { return true - } else { - return false } } return false diff --git a/pkg/tc/server/callback_message_queue.go b/pkg/tc/server/callback_message_queue.go new file mode 100644 index 00000000..7a1dfe89 --- /dev/null +++ b/pkg/tc/server/callback_message_queue.go @@ -0,0 +1,37 @@ +package server + +import ( + "sync" + + "github.com/opentrx/seata-golang/v2/pkg/apis" +) + +type CallbackMessageQueue struct { + lock *sync.Mutex + + queue []*apis.BranchMessage +} + +func NewCallbackMessageQueue() *CallbackMessageQueue { + return &CallbackMessageQueue{ + queue: make([]*apis.BranchMessage, 0), + lock: &sync.Mutex{}, + } +} + +func (p *CallbackMessageQueue) Enqueue(msg *apis.BranchMessage) { + p.lock.Lock() + defer p.lock.Unlock() + p.queue = append(p.queue, msg) +} + +func (p *CallbackMessageQueue) Dequeue() *apis.BranchMessage { + p.lock.Lock() + defer p.lock.Unlock() + if len(p.queue) == 0 { + return nil + } + var msg *apis.BranchMessage + msg, p.queue = p.queue[0], p.queue[1:] + return msg +} diff --git a/pkg/tc/server/global_session_locker.go b/pkg/tc/server/global_session_locker.go index aba3e6bb..6cff4533 100644 --- a/pkg/tc/server/global_session_locker.go +++ b/pkg/tc/server/global_session_locker.go @@ -1,8 +1,9 @@ package server import ( - "github.com/opentrx/seata-golang/v2/pkg/apis" "time" + + "github.com/opentrx/seata-golang/v2/pkg/apis" ) type GlobalSessionLocker interface { diff --git a/pkg/tc/server/transaction_coordinator.go b/pkg/tc/server/transaction_coordinator.go index 8fea719e..b35f584c 100644 --- a/pkg/tc/server/transaction_coordinator.go +++ b/pkg/tc/server/transaction_coordinator.go @@ -3,16 +3,19 @@ package server import ( "context" "fmt" + "io" "os" "sync" "time" - "google.golang.org/grpc" + "github.com/gogo/protobuf/types" + "go.uber.org/atomic" "google.golang.org/grpc/codes" - "google.golang.org/grpc/keepalive" + "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" "github.com/opentrx/seata-golang/v2/pkg/apis" + common2 "github.com/opentrx/seata-golang/v2/pkg/common" "github.com/opentrx/seata-golang/v2/pkg/tc/config" "github.com/opentrx/seata-golang/v2/pkg/tc/event" "github.com/opentrx/seata-golang/v2/pkg/tc/holder" @@ -26,7 +29,7 @@ import ( "github.com/opentrx/seata-golang/v2/pkg/util/uuid" ) -const ALWAYS_RETRY_BOUNDARY = 0 +const AlwaysRetryBoundary = 0 type TransactionCoordinator struct { sync.Mutex @@ -39,12 +42,16 @@ type TransactionCoordinator struct { rollingBackRetryPeriod time.Duration timeoutRetryPeriod time.Duration + streamMessageTimeout time.Duration + holder *holder.SessionHolder resourceDataLocker *lock.LockManager locker GlobalSessionLocker - keepaliveClientParameters keepalive.ClientParameters - tcServiceClients map[string]apis.BranchTransactionServiceClient + idGenerator *atomic.Uint64 + futures *sync.Map + activeApplications *sync.Map + callBackMessages *sync.Map } func NewTransactionCoordinator(conf *config.Configuration) *TransactionCoordinator { @@ -63,12 +70,16 @@ func NewTransactionCoordinator(conf *config.Configuration) *TransactionCoordinat rollingBackRetryPeriod: conf.Server.RollingBackRetryPeriod, timeoutRetryPeriod: conf.Server.TimeoutRetryPeriod, + streamMessageTimeout: conf.Server.StreamMessageTimeout, + holder: holder.NewSessionHolder(driver), resourceDataLocker: lock.NewLockManager(driver), locker: new(UnimplementedGlobalSessionLocker), - keepaliveClientParameters: conf.GetClientParameters(), - tcServiceClients: make(map[string]apis.BranchTransactionServiceClient), + idGenerator: &atomic.Uint64{}, + futures: &sync.Map{}, + activeApplications: &sync.Map{}, + callBackMessages: &sync.Map{}, } go tc.processTimeoutCheck() go tc.processAsyncCommitting() @@ -78,7 +89,7 @@ func NewTransactionCoordinator(conf *config.Configuration) *TransactionCoordinat return tc } -func (tc TransactionCoordinator) Begin(ctx context.Context, request *apis.GlobalBeginRequest) (*apis.GlobalBeginResponse, error) { +func (tc *TransactionCoordinator) Begin(ctx context.Context, request *apis.GlobalBeginRequest) (*apis.GlobalBeginResponse, error) { transactionID := uuid.NextID() xid := common.GenerateXID(request.Addressing, transactionID) gt := model.GlobalTransaction{ @@ -112,7 +123,7 @@ func (tc TransactionCoordinator) Begin(ctx context.Context, request *apis.Global }, nil } -func (tc TransactionCoordinator) GetStatus(ctx context.Context, request *apis.GlobalStatusRequest) (*apis.GlobalStatusResponse, error) { +func (tc *TransactionCoordinator) GetStatus(ctx context.Context, request *apis.GlobalStatusRequest) (*apis.GlobalStatusResponse, error) { gs := tc.holder.FindGlobalSession(request.XID) if gs != nil { return &apis.GlobalStatusResponse{ @@ -126,11 +137,11 @@ func (tc TransactionCoordinator) GetStatus(ctx context.Context, request *apis.Gl }, nil } -func (tc TransactionCoordinator) GlobalReport(ctx context.Context, request *apis.GlobalReportRequest) (*apis.GlobalReportResponse, error) { +func (tc *TransactionCoordinator) GlobalReport(ctx context.Context, request *apis.GlobalReportRequest) (*apis.GlobalReportResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GlobalReport not implemented") } -func (tc TransactionCoordinator) Commit(ctx context.Context, request *apis.GlobalCommitRequest) (*apis.GlobalCommitResponse, error) { +func (tc *TransactionCoordinator) Commit(ctx context.Context, request *apis.GlobalCommitRequest) (*apis.GlobalCommitResponse, error) { gt := tc.holder.FindGlobalTransaction(request.XID) if gt == nil { return &apis.GlobalCommitResponse{ @@ -148,11 +159,17 @@ func (tc TransactionCoordinator) Commit(ctx context.Context, request *apis.Globa if gt.Active { // Active need persistence // Highlight: Firstly, close the session, then no more branch can be registered. - tc.holder.InactiveGlobalSession(gt.GlobalSession) + err = tc.holder.InactiveGlobalSession(gt.GlobalSession) + if err != nil { + return false, err + } } tc.resourceDataLocker.ReleaseGlobalSessionLock(gt) if gt.Status == apis.Begin { - tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.Committing) + err = tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.Committing) + if err != nil { + return false, err + } return true, nil } return false, nil @@ -183,33 +200,33 @@ func (tc TransactionCoordinator) Commit(ctx context.Context, request *apis.Globa } if gt.CanBeCommittedAsync() { - tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.AsyncCommitting) - return &apis.GlobalCommitResponse{ - ResultCode: apis.ResultCodeSuccess, - GlobalStatus: apis.Committed, - }, nil - } else { - _, err := tc.doGlobalCommit(gt, false) + err = tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.AsyncCommitting) if err != nil { - return &apis.GlobalCommitResponse{ - ResultCode: apis.ResultCodeFailed, - ExceptionCode: apis.UnknownErr, - Message: err.Error(), - GlobalStatus: gt.Status, - }, nil + return nil, err } return &apis.GlobalCommitResponse{ ResultCode: apis.ResultCodeSuccess, GlobalStatus: apis.Committed, }, nil } + + _, err = tc.doGlobalCommit(gt, false) + if err != nil { + return &apis.GlobalCommitResponse{ + ResultCode: apis.ResultCodeFailed, + ExceptionCode: apis.UnknownErr, + Message: err.Error(), + GlobalStatus: gt.Status, + }, nil + } + return &apis.GlobalCommitResponse{ + ResultCode: apis.ResultCodeSuccess, + GlobalStatus: apis.Committed, + }, nil } -func (tc TransactionCoordinator) doGlobalCommit(gt *model.GlobalTransaction, retrying bool) (bool, error) { - var ( - success = true - err error - ) +func (tc *TransactionCoordinator) doGlobalCommit(gt *model.GlobalTransaction, retrying bool) (bool, error) { + var err error runtime.GoWithRecover(func() { evt := event.NewGlobalTransactionEvent(gt.TransactionID, event.RoleTC, gt.TransactionName, gt.BeginTime, 0, gt.Status) @@ -218,110 +235,154 @@ func (tc TransactionCoordinator) doGlobalCommit(gt *model.GlobalTransaction, ret if gt.IsSaga() { return false, status.Errorf(codes.Unimplemented, "method Commit not supported saga mode") - } else { - for bs := range gt.BranchSessions { - if bs.Status == apis.PhaseOneFailed { - tc.resourceDataLocker.ReleaseLock(bs) - delete(gt.BranchSessions, bs) - tc.holder.RemoveBranchSession(gt.GlobalSession, bs) - continue + } + + for bs := range gt.BranchSessions { + if bs.Status == apis.PhaseOneFailed { + tc.resourceDataLocker.ReleaseLock(bs) + delete(gt.BranchSessions, bs) + err = tc.holder.RemoveBranchSession(gt.GlobalSession, bs) + if err != nil { + return false, err } - branchStatus, err1 := tc.branchCommit(bs) - if err1 != nil { - log.Errorf("exception committing branch %v, err: %s", bs, err1.Error()) - if !retrying { - tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.CommitRetrying) + continue + } + branchStatus, err1 := tc.branchCommit(bs) + if err1 != nil { + log.Errorf("exception committing branch xid=%d branchID=%d, err: %v", bs.GetXID(), bs.BranchID, err1) + if !retrying { + err = tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.CommitRetrying) + if err != nil { + return false, err } - return false, err1 } - switch branchStatus { - case apis.PhaseTwoCommitted: - tc.resourceDataLocker.ReleaseLock(bs) - delete(gt.BranchSessions, bs) - tc.holder.RemoveBranchSession(gt.GlobalSession, bs) - continue - case apis.PhaseTwoCommitFailedCanNotRetry: - { - if gt.CanBeCommittedAsync() { - log.Errorf("by [%s], failed to commit branch %v", bs.Status.String(), bs) - continue - } else { - // change status first, if need retention global session data, - // might not remove global session, then, the status is very important. - tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.CommitFailed) - tc.resourceDataLocker.ReleaseGlobalSessionLock(gt) - tc.holder.RemoveGlobalTransaction(gt) - log.Errorf("finally, failed to commit global[%d] since branch[%d] commit failed", gt.XID, bs.BranchID) - return false, nil + return false, err1 + } + switch branchStatus { + case apis.PhaseTwoCommitted: + tc.resourceDataLocker.ReleaseLock(bs) + delete(gt.BranchSessions, bs) + err = tc.holder.RemoveBranchSession(gt.GlobalSession, bs) + if err != nil { + return false, err + } + continue + case apis.PhaseTwoCommitFailedCanNotRetry: + { + if gt.CanBeCommittedAsync() { + log.Errorf("by [%s], failed to commit branch %v", bs.Status.String(), bs) + continue + } else { + // change status first, if need retention global session data, + // might not remove global session, then, the status is very important. + err = tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.CommitFailed) + if err != nil { + return false, err } - } - default: - { - if !retrying { - tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.CommitRetrying) - return false, nil + tc.resourceDataLocker.ReleaseGlobalSessionLock(gt) + err = tc.holder.RemoveGlobalTransaction(gt) + if err != nil { + return false, err } - if gt.CanBeCommittedAsync() { - log.Errorf("by [%s], failed to commit branch %v", bs.Status.String(), bs) - continue - } else { - log.Errorf("failed to commit global[%d] since branch[%d] commit failed, will retry later.", gt.XID, bs.BranchID) - return false, nil + log.Errorf("finally, failed to commit global[%d] since branch[%d] commit failed", gt.XID, bs.BranchID) + return false, nil + } + } + default: + { + if !retrying { + err = tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.CommitRetrying) + if err != nil { + return false, err } + return false, nil + } + if gt.CanBeCommittedAsync() { + log.Errorf("by [%s], failed to commit branch %v", bs.Status.String(), bs) + continue + } else { + log.Errorf("failed to commit global[%d] since branch[%d] commit failed, will retry later.", gt.XID, bs.BranchID) + return false, nil } } } - gs := tc.holder.FindGlobalTransaction(gt.XID) - if gs != nil && gs.HasBranch() { - log.Infof("global[%d] committing is NOT done.", gt.XID) - return false, nil - } } - if success { - // change status first, if need retention global session data, - // might not remove global session, then, the status is very important. - tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.Committed) - tc.resourceDataLocker.ReleaseGlobalSessionLock(gt) - tc.holder.RemoveGlobalTransaction(gt) - - runtime.GoWithRecover(func() { - evt := event.NewGlobalTransactionEvent(gt.TransactionID, event.RoleTC, gt.TransactionName, gt.BeginTime, - int64(time2.CurrentTimeMillis()), gt.Status) - event.EventBus.GlobalTransactionEventChannel <- evt - }, nil) - - log.Infof("global[%d] committing is successfully done.", gt.XID) + gs := tc.holder.FindGlobalTransaction(gt.XID) + if gs != nil && gs.HasBranch() { + log.Infof("global[%d] committing is NOT done.", gt.XID) + return false, nil } - return success, err -} -func (tc TransactionCoordinator) branchCommit(bs *apis.BranchSession) (apis.BranchSession_BranchStatus, error) { - client, err := tc.getTransactionCoordinatorServiceClient(bs.Addressing) + // change status first, if need retention global session data, + // might not remove global session, then, the status is very important. + err = tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.Committed) if err != nil { - return bs.Status, err + return false, err } + tc.resourceDataLocker.ReleaseGlobalSessionLock(gt) + err = tc.holder.RemoveGlobalTransaction(gt) + if err != nil { + return false, err + } + runtime.GoWithRecover(func() { + evt := event.NewGlobalTransactionEvent(gt.TransactionID, event.RoleTC, gt.TransactionName, gt.BeginTime, + int64(time2.CurrentTimeMillis()), gt.Status) + event.EventBus.GlobalTransactionEventChannel <- evt + }, nil) + log.Infof("global[%d] committing is successfully done.", gt.XID) + + return true, err +} - response, err := client.BranchCommit(context.Background(), &apis.BranchCommitRequest{ +func (tc *TransactionCoordinator) branchCommit(bs *apis.BranchSession) (apis.BranchSession_BranchStatus, error) { + request := &apis.BranchCommitRequest{ XID: bs.XID, BranchID: bs.BranchID, ResourceID: bs.ResourceID, LockKey: bs.LockKey, BranchType: bs.Type, ApplicationData: bs.ApplicationData, - }) + } + content, err := types.MarshalAny(request) if err != nil { return bs.Status, err } + message := &apis.BranchMessage{ + ID: int64(tc.idGenerator.Inc()), + BranchMessageType: apis.TypeBranchCommit, + Message: content, + } + + queue, _ := tc.callBackMessages.LoadOrStore(bs.Addressing, NewCallbackMessageQueue()) + q := queue.(*CallbackMessageQueue) + q.Enqueue(message) + + resp := common2.NewMessageFuture(message) + tc.futures.Store(message.ID, resp) + + timer := time.NewTimer(tc.streamMessageTimeout) + select { + case <-timer.C: + tc.futures.Delete(resp.ID) + return bs.Status, fmt.Errorf("wait branch commit response timeout") + case <-resp.Done: + timer.Stop() + } + + response, ok := resp.Response.(*apis.BranchCommitResponse) + if !ok { + log.Infof("rollback response: %v", resp.Response) + return bs.Status, fmt.Errorf("response type not right") + } if response.ResultCode == apis.ResultCodeSuccess { return response.BranchStatus, nil - } else { - return bs.Status, fmt.Errorf(response.Message) } + return bs.Status, fmt.Errorf(response.Message) } -func (tc TransactionCoordinator) Rollback(ctx context.Context, request *apis.GlobalRollbackRequest) (*apis.GlobalRollbackResponse, error) { +func (tc *TransactionCoordinator) Rollback(ctx context.Context, request *apis.GlobalRollbackRequest) (*apis.GlobalRollbackResponse, error) { gt := tc.holder.FindGlobalTransaction(request.XID) if gt == nil { return &apis.GlobalRollbackResponse{ @@ -339,10 +400,16 @@ func (tc TransactionCoordinator) Rollback(ctx context.Context, request *apis.Glo if gt.Active { // Active need persistence // Highlight: Firstly, close the session, then no more branch can be registered. - tc.holder.InactiveGlobalSession(gt.GlobalSession) + err = tc.holder.InactiveGlobalSession(gt.GlobalSession) + if err != nil { + return false, err + } } if gt.Status == apis.Begin { - tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.RollingBack) + err = tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.RollingBack) + if err != nil { + return false, err + } return true, nil } return false, nil @@ -366,18 +433,18 @@ func (tc TransactionCoordinator) Rollback(ctx context.Context, request *apis.Glo }, nil } - tc.doGlobalRollback(gt, false) + _, err = tc.doGlobalRollback(gt, false) + if err != nil { + return nil, err + } return &apis.GlobalRollbackResponse{ ResultCode: apis.ResultCodeSuccess, GlobalStatus: gt.Status, }, nil } -func (tc TransactionCoordinator) doGlobalRollback(gt *model.GlobalTransaction, retrying bool) (bool, error) { - var ( - success = true - err error - ) +func (tc *TransactionCoordinator) doGlobalRollback(gt *model.GlobalTransaction, retrying bool) (bool, error) { + var err error runtime.GoWithRecover(func() { evt := event.NewGlobalTransactionEvent(gt.TransactionID, event.RoleTC, gt.TransactionName, gt.BeginTime, 0, gt.Status) @@ -386,115 +453,263 @@ func (tc TransactionCoordinator) doGlobalRollback(gt *model.GlobalTransaction, r if gt.IsSaga() { return false, status.Errorf(codes.Unimplemented, "method Commit not supported saga mode") - } else { - for bs := range gt.BranchSessions { - if bs.Status == apis.PhaseOneFailed { - tc.resourceDataLocker.ReleaseLock(bs) - delete(gt.BranchSessions, bs) - tc.holder.RemoveBranchSession(gt.GlobalSession, bs) - continue + } + + for bs := range gt.BranchSessions { + if bs.Status == apis.PhaseOneFailed { + tc.resourceDataLocker.ReleaseLock(bs) + delete(gt.BranchSessions, bs) + err = tc.holder.RemoveBranchSession(gt.GlobalSession, bs) + if err != nil { + return false, err } - branchStatus, err1 := tc.branchRollback(bs) - if err1 != nil { - log.Errorf("exception rolling back branch xid=%d branchID=%d", gt.XID, bs.BranchID) - if !retrying { - if gt.IsTimeoutGlobalStatus() { - tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.TimeoutRollbackRetrying) - } else { - tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.RollbackRetrying) + continue + } + branchStatus, err1 := tc.branchRollback(bs) + if err1 != nil { + log.Errorf("exception rolling back branch xid=%d branchID=%d, err: %v", gt.XID, bs.BranchID, err1) + if !retrying { + if gt.IsTimeoutGlobalStatus() { + err = tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.TimeoutRollbackRetrying) + if err != nil { + return false, err } + } else { + err = tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.RollbackRetrying) + if err != nil { + return false, err + } + } + } + return false, err1 + } + switch branchStatus { + case apis.PhaseTwoRolledBack: + tc.resourceDataLocker.ReleaseLock(bs) + delete(gt.BranchSessions, bs) + err = tc.holder.RemoveBranchSession(gt.GlobalSession, bs) + if err != nil { + return false, err + } + log.Infof("successfully rollback branch xid=%d branchID=%d", gt.XID, bs.BranchID) + continue + case apis.PhaseTwoRollbackFailedCanNotRetry: + if gt.IsTimeoutGlobalStatus() { + err = tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.TimeoutRollbackFailed) + if err != nil { + return false, err + } + } else { + err = tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.RollbackFailed) + if err != nil { + return false, err } - return false, err1 } - switch branchStatus { - case apis.PhaseTwoRolledBack: - tc.resourceDataLocker.ReleaseLock(bs) - delete(gt.BranchSessions, bs) - tc.holder.RemoveBranchSession(gt.GlobalSession, bs) - log.Infof("successfully rollback branch xid=%d branchID=%d", gt.XID, bs.BranchID) - continue - case apis.PhaseTwoRollbackFailedCanNotRetry: + tc.resourceDataLocker.ReleaseGlobalSessionLock(gt) + err = tc.holder.RemoveGlobalTransaction(gt) + if err != nil { + return false, err + } + log.Infof("failed to rollback branch and stop retry xid=%d branchID=%d", gt.XID, bs.BranchID) + return false, nil + default: + log.Infof("failed to rollback branch xid=%d branchID=%d", gt.XID, bs.BranchID) + if !retrying { if gt.IsTimeoutGlobalStatus() { - tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.TimeoutRollbackFailed) + err = tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.TimeoutRollbackRetrying) + if err != nil { + return false, err + } } else { - tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.RollbackFailed) - } - tc.resourceDataLocker.ReleaseGlobalSessionLock(gt) - tc.holder.RemoveGlobalTransaction(gt) - log.Infof("failed to rollback branch and stop retry xid=%d branchID=%d", gt.XID, bs.BranchID) - return false, nil - default: - log.Infof("failed to rollback branch xid=%d branchID=%d", gt.XID, bs.BranchID) - if !retrying { - if gt.IsTimeoutGlobalStatus() { - tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.TimeoutRollbackRetrying) - } else { - tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.RollbackRetrying) + err = tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.RollbackRetrying) + if err != nil { + return false, err } } - return false, nil } - } - - // In db mode, there is a problem of inconsistent data in multiple copies, resulting in new branch - // transaction registration when rolling back. - // 1. New branch transaction and rollback branch transaction have no data association - // 2. New branch transaction has data association with rollback branch transaction - // The second query can solve the first problem, and if it is the second problem, it may cause a rollback - // failure due to data changes. - gs := tc.holder.FindGlobalTransaction(gt.XID) - if gs != nil && gs.HasBranch() { - log.Infof("Global[%d] rolling back is NOT done.", gt.XID) return false, nil } } - if success { - if gt.IsTimeoutGlobalStatus() { - tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.TimeoutRolledBack) - } else { - tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.RolledBack) - } - tc.resourceDataLocker.ReleaseGlobalSessionLock(gt) - tc.holder.RemoveGlobalTransaction(gt) - - runtime.GoWithRecover(func() { - evt := event.NewGlobalTransactionEvent(gt.TransactionID, event.RoleTC, gt.TransactionName, gt.BeginTime, - int64(time2.CurrentTimeMillis()), gt.Status) - event.EventBus.GlobalTransactionEventChannel <- evt - }, nil) - log.Infof("successfully rollback global, xid = %d", gt.XID) + // In db mode, there is a problem of inconsistent data in multiple copies, resulting in new branch + // transaction registration when rolling back. + // 1. New branch transaction and rollback branch transaction have no data association + // 2. New branch transaction has data association with rollback branch transaction + // The second query can solve the first problem, and if it is the second problem, it may cause a rollback + // failure due to data changes. + gs := tc.holder.FindGlobalTransaction(gt.XID) + if gs != nil && gs.HasBranch() { + log.Infof("Global[%d] rolling back is NOT done.", gt.XID) + return false, nil } - return success, err -} -func (tc TransactionCoordinator) branchRollback(bs *apis.BranchSession) (apis.BranchSession_BranchStatus, error) { - client, err := tc.getTransactionCoordinatorServiceClient(bs.Addressing) + if gt.IsTimeoutGlobalStatus() { + err = tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.TimeoutRolledBack) + if err != nil { + return false, err + } + } else { + err = tc.holder.UpdateGlobalSessionStatus(gt.GlobalSession, apis.RolledBack) + if err != nil { + return false, err + } + } + tc.resourceDataLocker.ReleaseGlobalSessionLock(gt) + err = tc.holder.RemoveGlobalTransaction(gt) if err != nil { - return bs.Status, err + return false, err } + runtime.GoWithRecover(func() { + evt := event.NewGlobalTransactionEvent(gt.TransactionID, event.RoleTC, gt.TransactionName, gt.BeginTime, + int64(time2.CurrentTimeMillis()), gt.Status) + event.EventBus.GlobalTransactionEventChannel <- evt + }, nil) + log.Infof("successfully rollback global, xid = %d", gt.XID) + + return true, err +} - response, err := client.BranchRollback(context.Background(), &apis.BranchRollbackRequest{ +func (tc *TransactionCoordinator) branchRollback(bs *apis.BranchSession) (apis.BranchSession_BranchStatus, error) { + request := &apis.BranchRollbackRequest{ XID: bs.XID, BranchID: bs.BranchID, ResourceID: bs.ResourceID, LockKey: bs.LockKey, BranchType: bs.Type, ApplicationData: bs.ApplicationData, - }) + } + content, err := types.MarshalAny(request) if err != nil { return bs.Status, err } + message := &apis.BranchMessage{ + ID: int64(tc.idGenerator.Inc()), + BranchMessageType: apis.TypeBranchRollback, + Message: content, + } + + queue, _ := tc.callBackMessages.LoadOrStore(bs.Addressing, NewCallbackMessageQueue()) + q := queue.(*CallbackMessageQueue) + q.Enqueue(message) + + resp := common2.NewMessageFuture(message) + tc.futures.Store(message.ID, resp) + + timer := time.NewTimer(tc.streamMessageTimeout) + select { + case <-timer.C: + tc.futures.Delete(resp.ID) + timer.Stop() + return bs.Status, fmt.Errorf("wait branch rollback response timeout") + case <-resp.Done: + timer.Stop() + } + response := resp.Response.(*apis.BranchRollbackResponse) if response.ResultCode == apis.ResultCodeSuccess { return response.BranchStatus, nil - } else { - return bs.Status, fmt.Errorf(response.Message) } + return bs.Status, fmt.Errorf(response.Message) } -func (tc TransactionCoordinator) BranchRegister(ctx context.Context, request *apis.BranchRegisterRequest) (*apis.BranchRegisterResponse, error) { +func (tc *TransactionCoordinator) BranchCommunicate(stream apis.ResourceManagerService_BranchCommunicateServer) error { + var addressing string + done := make(chan bool) + + ctx := stream.Context() + md, ok := metadata.FromIncomingContext(ctx) + if ok { + addressing = md.Get("addressing")[0] + c, ok := tc.activeApplications.Load(addressing) + if ok { + count := c.(int) + tc.activeApplications.Store(addressing, count+1) + } else { + tc.activeApplications.Store(addressing, 1) + } + defer func() { + c, _ := tc.activeApplications.Load(addressing) + count := c.(int) + tc.activeApplications.Store(addressing, count-1) + }() + } + + queue, _ := tc.callBackMessages.LoadOrStore(addressing, NewCallbackMessageQueue()) + q := queue.(*CallbackMessageQueue) + + runtime.GoWithRecover(func() { + for { + select { + case _, ok := <-done: + if !ok { + return + } + default: + msg := q.Dequeue() + if msg == nil { + break + } + err := stream.Send(msg) + if err != nil { + return + } + } + } + }, nil) + + for { + select { + case <-ctx.Done(): + close(done) + return ctx.Err() + default: + branchMessage, err := stream.Recv() + if err == io.EOF { + close(done) + return nil + } + if err != nil { + close(done) + return err + } + switch branchMessage.GetBranchMessageType() { + case apis.TypeBranchCommitResult: + response := &apis.BranchCommitResponse{} + data := branchMessage.GetMessage().GetValue() + err := response.Unmarshal(data) + if err != nil { + log.Error(err) + continue + } + resp, loaded := tc.futures.Load(branchMessage.ID) + if loaded { + future := resp.(*common2.MessageFuture) + future.Response = response + future.Done <- true + tc.futures.Delete(branchMessage.ID) + } + case apis.TypeBranchRollBackResult: + response := &apis.BranchRollbackResponse{} + data := branchMessage.GetMessage().GetValue() + err := response.Unmarshal(data) + if err != nil { + log.Error(err) + continue + } + resp, loaded := tc.futures.Load(branchMessage.ID) + if loaded { + future := resp.(*common2.MessageFuture) + future.Response = response + future.Done <- true + tc.futures.Delete(branchMessage.ID) + } + } + } + } +} + +func (tc *TransactionCoordinator) BranchRegister(ctx context.Context, request *apis.BranchRegisterRequest) (*apis.BranchRegisterResponse, error) { gt := tc.holder.FindGlobalTransaction(request.XID) if gt == nil { log.Errorf("could not found global transaction xid = %s", request.XID) @@ -557,17 +772,14 @@ func (tc TransactionCoordinator) BranchRegister(ctx context.Context, request *ap err := tc.holder.AddBranchSession(gt.GlobalSession, bs) if err != nil { + log.Error(err) return &apis.BranchRegisterResponse{ ResultCode: apis.ResultCodeFailed, ExceptionCode: apis.BranchRegisterFailed, - Message: fmt.Sprintf("branch register failed,xid = %s, branchID = %d", gt.XID, bs.BranchID), + Message: fmt.Sprintf("branch register failed, xid = %s, branchID = %d, err: %s", gt.XID, bs.BranchID, err.Error()), }, nil } - if !gt.IsSaga() { - tc.getTransactionCoordinatorServiceClient(bs.Addressing) - } - return &apis.BranchRegisterResponse{ ResultCode: apis.ResultCodeSuccess, BranchID: bs.BranchID, @@ -581,7 +793,7 @@ func (tc TransactionCoordinator) BranchRegister(ctx context.Context, request *ap }, nil } -func (tc TransactionCoordinator) BranchReport(ctx context.Context, request *apis.BranchReportRequest) (*apis.BranchReportResponse, error) { +func (tc *TransactionCoordinator) BranchReport(ctx context.Context, request *apis.BranchReportRequest) (*apis.BranchReportResponse, error) { gt := tc.holder.FindGlobalTransaction(request.XID) if gt == nil { log.Errorf("could not found global transaction xid = %s", request.XID) @@ -606,7 +818,7 @@ func (tc TransactionCoordinator) BranchReport(ctx context.Context, request *apis return &apis.BranchReportResponse{ ResultCode: apis.ResultCodeFailed, ExceptionCode: apis.BranchReportFailed, - Message: fmt.Sprintf("branch report failed,xid = %s, branchID = %d", gt.XID, bs.BranchID), + Message: fmt.Sprintf("branch report failed, xid = %s, branchID = %d, err: %s", gt.XID, bs.BranchID, err.Error()), }, nil } @@ -615,7 +827,7 @@ func (tc TransactionCoordinator) BranchReport(ctx context.Context, request *apis }, nil } -func (tc TransactionCoordinator) LockQuery(ctx context.Context, request *apis.GlobalLockQueryRequest) (*apis.GlobalLockQueryResponse, error) { +func (tc *TransactionCoordinator) LockQuery(ctx context.Context, request *apis.GlobalLockQueryRequest) (*apis.GlobalLockQueryResponse, error) { result := tc.resourceDataLocker.IsLockable(request.XID, request.ResourceID, request.LockKey) return &apis.GlobalLockQueryResponse{ ResultCode: apis.ResultCodeSuccess, @@ -623,89 +835,73 @@ func (tc TransactionCoordinator) LockQuery(ctx context.Context, request *apis.Gl }, nil } -func (tc TransactionCoordinator) getTransactionCoordinatorServiceClient(addressing string) (apis.BranchTransactionServiceClient, error) { - client1, ok1 := tc.tcServiceClients[addressing] - if ok1 { - return client1, nil - } - - tc.Mutex.Lock() - defer tc.Mutex.Unlock() - client2, ok2 := tc.tcServiceClients[addressing] - if ok2 { - return client2, nil - } - - conn, err := grpc.Dial(addressing, grpc.WithInsecure(), grpc.WithKeepaliveParams(tc.keepaliveClientParameters)) - if err != nil { - return nil, err - } - client := apis.NewBranchTransactionServiceClient(conn) - tc.tcServiceClients[addressing] = client - return client, nil -} - -func (tc TransactionCoordinator) processTimeoutCheck() { +func (tc *TransactionCoordinator) processTimeoutCheck() { for { timer := time.NewTimer(tc.timeoutRetryPeriod) - select { - case <-timer.C: - tc.timeoutCheck() - } + + <-timer.C + tc.timeoutCheck() + timer.Stop() } } -func (tc TransactionCoordinator) processRetryRollingBack() { +func (tc *TransactionCoordinator) processRetryRollingBack() { for { timer := time.NewTimer(tc.rollingBackRetryPeriod) - select { - case <-timer.C: - tc.handleRetryRollingBack() - } + + <-timer.C + tc.handleRetryRollingBack() + timer.Stop() } } -func (tc TransactionCoordinator) processRetryCommitting() { +func (tc *TransactionCoordinator) processRetryCommitting() { for { timer := time.NewTimer(tc.committingRetryPeriod) - select { - case <-timer.C: - tc.handleRetryCommitting() - } + + <-timer.C + tc.handleRetryCommitting() + timer.Stop() } } -func (tc TransactionCoordinator) processAsyncCommitting() { +func (tc *TransactionCoordinator) processAsyncCommitting() { for { timer := time.NewTimer(tc.asyncCommittingRetryPeriod) - select { - case <-timer.C: - tc.handleAsyncCommitting() - } + + <-timer.C + tc.handleAsyncCommitting() + timer.Stop() } } -func (tc TransactionCoordinator) timeoutCheck() { - allSessions := tc.holder.AllSessions() - if allSessions == nil && len(allSessions) <= 0 { +func (tc *TransactionCoordinator) timeoutCheck() { + sessions := tc.holder.FindGlobalSessions([]apis.GlobalSession_GlobalStatus{apis.Begin}) + if len(sessions) == 0 { return } - for _, globalSession := range allSessions { - if globalSession.Status == apis.Begin && isGlobalSessionTimeout(globalSession) { + for _, globalSession := range sessions { + if isGlobalSessionTimeout(globalSession) { result, err := tc.locker.TryLock(globalSession, time.Duration(globalSession.Timeout)*time.Millisecond) if err == nil && result { if globalSession.Active { // Active need persistence // Highlight: Firstly, close the session, then no more branch can be registered. - tc.holder.InactiveGlobalSession(globalSession) + err = tc.holder.InactiveGlobalSession(globalSession) + if err != nil { + return + } } - if globalSession.Status == apis.Begin { - tc.holder.UpdateGlobalSessionStatus(globalSession, apis.TimeoutRollingBack) + + err = tc.holder.UpdateGlobalSessionStatus(globalSession, apis.TimeoutRollingBack) + if err != nil { + return } + tc.locker.Unlock(globalSession) evt := event.NewGlobalTransactionEvent(globalSession.TransactionID, event.RoleTC, globalSession.TransactionName, globalSession.BeginTime, 0, globalSession.Status) event.EventBus.GlobalTransactionEventChannel <- evt @@ -714,9 +910,13 @@ func (tc TransactionCoordinator) timeoutCheck() { } } -func (tc TransactionCoordinator) handleRetryRollingBack() { - rollbackTransactions := tc.holder.FindRetryRollbackGlobalTransactions() - if rollbackTransactions == nil && len(rollbackTransactions) <= 0 { +func (tc *TransactionCoordinator) handleRetryRollingBack() { + addressingIdentities := tc.getAddressingIdentities() + if len(addressingIdentities) == 0 { + return + } + rollbackTransactions := tc.holder.FindRetryRollbackGlobalTransactions(addressingIdentities) + if len(rollbackTransactions) == 0 { return } now := time2.CurrentTimeMillis() @@ -728,7 +928,10 @@ func (tc TransactionCoordinator) handleRetryRollingBack() { if tc.rollbackRetryTimeoutUnlockEnable { tc.resourceDataLocker.ReleaseGlobalSessionLock(transaction) } - tc.holder.RemoveGlobalTransaction(transaction) + err := tc.holder.RemoveGlobalTransaction(transaction) + if err != nil { + log.Error(err) + } log.Errorf("GlobalSession rollback retry timeout and removed [%s]", transaction.XID) continue } @@ -740,21 +943,28 @@ func (tc TransactionCoordinator) handleRetryRollingBack() { } func isRetryTimeout(now int64, timeout int64, beginTime int64) bool { - if timeout >= ALWAYS_RETRY_BOUNDARY && now-beginTime > timeout { + if timeout >= AlwaysRetryBoundary && now-beginTime > timeout { return true } return false } -func (tc TransactionCoordinator) handleRetryCommitting() { - committingTransactions := tc.holder.FindRetryCommittingGlobalTransactions() - if committingTransactions == nil && len(committingTransactions) <= 0 { +func (tc *TransactionCoordinator) handleRetryCommitting() { + addressingIdentities := tc.getAddressingIdentities() + if len(addressingIdentities) == 0 { + return + } + committingTransactions := tc.holder.FindRetryCommittingGlobalTransactions(addressingIdentities) + if len(committingTransactions) == 0 { return } now := time2.CurrentTimeMillis() for _, transaction := range committingTransactions { if isRetryTimeout(int64(now), tc.maxCommitRetryTimeout, transaction.BeginTime) { - tc.holder.RemoveGlobalTransaction(transaction) + err := tc.holder.RemoveGlobalTransaction(transaction) + if err != nil { + log.Error(err) + } log.Errorf("GlobalSession commit retry timeout and removed [%s]", transaction.XID) continue } @@ -765,9 +975,13 @@ func (tc TransactionCoordinator) handleRetryCommitting() { } } -func (tc TransactionCoordinator) handleAsyncCommitting() { - asyncCommittingTransactions := tc.holder.FindAsyncCommittingGlobalTransactions() - if asyncCommittingTransactions == nil && len(asyncCommittingTransactions) <= 0 { +func (tc *TransactionCoordinator) handleAsyncCommitting() { + addressingIdentities := tc.getAddressingIdentities() + if len(addressingIdentities) == 0 { + return + } + asyncCommittingTransactions := tc.holder.FindAsyncCommittingGlobalTransactions(addressingIdentities) + if len(asyncCommittingTransactions) == 0 { return } for _, transaction := range asyncCommittingTransactions { @@ -781,6 +995,19 @@ func (tc TransactionCoordinator) handleAsyncCommitting() { } } +func (tc *TransactionCoordinator) getAddressingIdentities() []string { + var addressIdentities []string + tc.activeApplications.Range(func(key, value interface{}) bool { + count := value.(int) + if count > 0 { + addressing := key.(string) + addressIdentities = append(addressIdentities, addressing) + } + return true + }) + return addressIdentities +} + func isGlobalSessionTimeout(gt *apis.GlobalSession) bool { return (time2.CurrentTimeMillis() - uint64(gt.BeginTime)) > uint64(gt.Timeout) } diff --git a/pkg/tc/storage/driver/factory/factory.go b/pkg/tc/storage/driver/factory/factory.go index c84b9e26..8adda320 100644 --- a/pkg/tc/storage/driver/factory/factory.go +++ b/pkg/tc/storage/driver/factory/factory.go @@ -10,15 +10,15 @@ import ( // factories var driverFactories = make(map[string]StorageDriverFactory) -// StorageDriverFactory is a factory interface for creating storage.StorageDriver interfaces +// StorageDriverFactory is a factory interface for creating storage.Driver interfaces // Storage drivers should call Register() with a factory to make the driver available by name. -// Individual StorageDriver implementations generally register with the factory via the Register +// Individual Driver implementations generally register with the factory via the Register // func (below) in their init() funcs, and as such they should be imported anonymously before use. type StorageDriverFactory interface { - // Create returns a new storage.StorageDriver with the given parameters + // Create returns a new storage.Driver with the given parameters // Parameters will vary by driver and may be ignored // Each parameter key must only consist of lowercase letters and numbers - Create(parameters map[string]interface{}) (storage.StorageDriver, error) + Create(parameters map[string]interface{}) (storage.Driver, error) } // Register makes a storage driver available by the provided name. @@ -37,11 +37,11 @@ func Register(name string, factory StorageDriverFactory) { driverFactories[name] = factory } -// Create a new storage.StorageDriver with the given name and +// Create a new storage.Driver with the given name and // parameters. To use a driver, the StorageDriverFactory must first be // registered with the given name. If no drivers are found, an // InvalidStorageDriverError is returned -func Create(name string, parameters map[string]interface{}) (storage.StorageDriver, error) { +func Create(name string, parameters map[string]interface{}) (storage.Driver, error) { driverFactory, ok := driverFactories[name] if !ok { return nil, InvalidStorageDriverError{name} @@ -55,5 +55,5 @@ type InvalidStorageDriverError struct { } func (err InvalidStorageDriverError) Error() string { - return fmt.Sprintf("StorageDriver not registered: %s", err.Name) + return fmt.Sprintf("Driver not registered: %s", err.Name) } diff --git a/pkg/tc/storage/driver/in_memory/inmemory.go b/pkg/tc/storage/driver/inmemory/inmemory.go similarity index 86% rename from pkg/tc/storage/driver/in_memory/inmemory.go rename to pkg/tc/storage/driver/inmemory/inmemory.go index d6f56e11..9208c5d7 100644 --- a/pkg/tc/storage/driver/in_memory/inmemory.go +++ b/pkg/tc/storage/driver/inmemory/inmemory.go @@ -1,4 +1,4 @@ -package in_memory +package inmemory import ( "fmt" @@ -9,7 +9,6 @@ import ( "github.com/opentrx/seata-golang/v2/pkg/tc/storage" "github.com/opentrx/seata-golang/v2/pkg/tc/storage/driver/factory" "github.com/opentrx/seata-golang/v2/pkg/util/log" - ) func init() { @@ -19,7 +18,7 @@ func init() { // inMemoryFactory implements the factory.StorageDriverFactory interface type inMemoryFactory struct{} -func (factory *inMemoryFactory) Create(parameters map[string]interface{}) (storage.StorageDriver, error) { +func (factory *inMemoryFactory) Create(parameters map[string]interface{}) (storage.Driver, error) { return &driver{ SessionMap: &sync.Map{}, LockMap: &sync.Map{}, @@ -73,6 +72,36 @@ func (driver *driver) FindGlobalSessions(statuses []apis.GlobalSession_GlobalSta return sessions } +// Find global sessions list with addressing identities +func (driver *driver) FindGlobalSessionsWithAddressingIdentities(statuses []apis.GlobalSession_GlobalStatus, + addressingIdentities []string) []*apis.GlobalSession { + contain := func(statuses []apis.GlobalSession_GlobalStatus, status apis.GlobalSession_GlobalStatus) bool { + for _, s := range statuses { + if s == status { + return true + } + } + return false + } + containAddressing := func(addressingIdentities []string, addressing string) bool { + for _, s := range addressingIdentities { + if s == addressing { + return true + } + } + return false + } + var sessions = make([]*apis.GlobalSession, 0) + driver.SessionMap.Range(func(key, value interface{}) bool { + session := value.(*model.GlobalTransaction) + if contain(statuses, session.Status) && containAddressing(addressingIdentities, session.Addressing) { + sessions = append(sessions, session.GlobalSession) + } + return true + }) + return sessions +} + // All sessions collection. func (driver *driver) AllSessions() []*apis.GlobalSession { var sessions = make([]*apis.GlobalSession, 0) diff --git a/pkg/tc/storage/driver/mysql/mysql.go b/pkg/tc/storage/driver/mysql/mysql.go index 6e4356c4..8ae0ea61 100644 --- a/pkg/tc/storage/driver/mysql/mysql.go +++ b/pkg/tc/storage/driver/mysql/mysql.go @@ -6,7 +6,7 @@ import ( "strings" "time" - _ "github.com/go-sql-driver/mysql" + _ "github.com/go-sql-driver/mysql" // register mysql "github.com/go-xorm/xorm" "xorm.io/builder" @@ -18,10 +18,10 @@ import ( ) const ( - InsertGlobalTransaction = `insert into %s (addressing, xid, transaction_id, transaction_name, timeout, begin_time, + InsertGlobalTransaction = `insert into %s (addressing, xid, transaction_id, transaction_name, timeout, begin_time, status, active, gmt_create, gmt_modified) values(?, ?, ?, ?, ?, ?, ?, ?, now(), now())` - QueryGlobalTransactionByXid = `select addressing, xid, transaction_id, transaction_name, timeout, begin_time, + QueryGlobalTransactionByXid = `select addressing, xid, transaction_id, transaction_name, timeout, begin_time, status, active, gmt_create, gmt_modified from %s where xid = ?` UpdateGlobalTransaction = "update %s set status = ?, gmt_modified = now() where xid = ?" @@ -43,7 +43,7 @@ const ( DeleteBranchTransaction = "delete from %s where xid = ? and branch_id = ?" - InsertRowLock = `insert into %s (xid, transaction_id, branch_id, resource_id, table_name, pk, row_key, gmt_create, + InsertRowLock = `insert into %s (xid, transaction_id, branch_id, resource_id, table_name, pk, row_key, gmt_create, gmt_modified) values %s` QueryRowKey = `select xid, transaction_id, branch_id, resource_id, table_name, pk, row_key, gmt_create, gmt_modified @@ -68,7 +68,7 @@ type DriverParameters struct { // mysqlFactory implements the factory.StorageDriverFactory interface type mysqlFactory struct{} -func (factory *mysqlFactory) Create(parameters map[string]interface{}) (storage.StorageDriver, error) { +func (factory *mysqlFactory) Create(parameters map[string]interface{}) (storage.Driver, error) { return FromParameters(parameters) } @@ -80,7 +80,7 @@ type driver struct { queryLimit int } -func FromParameters(parameters map[string]interface{}) (storage.StorageDriver, error) { +func FromParameters(parameters map[string]interface{}) (storage.Driver, error) { dsn := parameters["dsn"] if dsn == nil { dsn = "" @@ -184,7 +184,7 @@ func FromParameters(parameters map[string]interface{}) (storage.StorageDriver, e } // New constructs a new Driver -func New(params DriverParameters) (storage.StorageDriver, error) { +func New(params DriverParameters) (storage.Driver, error) { if params.DSN == "" { return nil, fmt.Errorf("the dsn parameter should not be empty") } @@ -242,11 +242,30 @@ func (driver *driver) FindGlobalSessions(statuses []apis.GlobalSession_GlobalSta return globalSessions } +// Find global sessions list with addressing identities +func (driver *driver) FindGlobalSessionsWithAddressingIdentities(statuses []apis.GlobalSession_GlobalStatus, + addressingIdentities []string) []*apis.GlobalSession { + var globalSessions []*apis.GlobalSession + err := driver.engine.Table(driver.globalTable). + Where(builder. + In("status", statuses). + And(builder.In("addressing", addressingIdentities))). + OrderBy("gmt_modified"). + Limit(driver.queryLimit). + Find(&globalSessions) + + if err != nil { + log.Errorf(err.Error()) + } + return globalSessions +} + // All sessions collection. func (driver *driver) AllSessions() []*apis.GlobalSession { var globalSessions []*apis.GlobalSession err := driver.engine.Table(driver.globalTable). OrderBy("gmt_modified"). + Limit(driver.queryLimit). Find(&globalSessions) if err != nil { diff --git a/pkg/tc/storage/driver/pgsql/pgsql.go b/pkg/tc/storage/driver/pgsql/pgsql.go index c34b1843..4e6b5460 100644 --- a/pkg/tc/storage/driver/pgsql/pgsql.go +++ b/pkg/tc/storage/driver/pgsql/pgsql.go @@ -7,7 +7,7 @@ import ( "time" "github.com/go-xorm/xorm" - _ "github.com/lib/pq" + _ "github.com/lib/pq" // register pg "xorm.io/builder" "github.com/opentrx/seata-golang/v2/pkg/apis" @@ -18,10 +18,10 @@ import ( ) const ( - InsertGlobalTransaction = `insert into %s (addressing, xid, transaction_id, transaction_name, timeout, begin_time, + InsertGlobalTransaction = `insert into %s (addressing, xid, transaction_id, transaction_name, timeout, begin_time, status, active, gmt_create, gmt_modified) values($1, $2, $3, $4, $5, $6, $7, $8, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)` - QueryGlobalTransactionByXid = `select addressing, xid, transaction_id, transaction_name, timeout, begin_time, + QueryGlobalTransactionByXid = `select addressing, xid, transaction_id, transaction_name, timeout, begin_time, status, active, gmt_create, gmt_modified from %s where xid = $1` UpdateGlobalTransaction = "update %s set status = $1, gmt_modified = CURRENT_TIMESTAMP where xid = $2" @@ -43,7 +43,7 @@ const ( DeleteBranchTransaction = "delete from %s where xid = $1 and branch_id = $2" - InsertRowLock = `insert into %s (xid, transaction_id, branch_id, resource_id, table_name, pk, row_key, gmt_create, + InsertRowLock = `insert into %s (xid, transaction_id, branch_id, resource_id, table_name, pk, row_key, gmt_create, gmt_modified) values %s` QueryRowKey = `select xid, transaction_id, branch_id, resource_id, table_name, pk, row_key, gmt_create, gmt_modified @@ -68,7 +68,7 @@ type DriverParameters struct { // pgsqlFactory implements the factory.StorageDriverFactory interface type pgsqlFactory struct{} -func (factory *pgsqlFactory) Create(parameters map[string]interface{}) (storage.StorageDriver, error) { +func (factory *pgsqlFactory) Create(parameters map[string]interface{}) (storage.Driver, error) { return FromParameters(parameters) } @@ -80,7 +80,7 @@ type driver struct { queryLimit int } -func FromParameters(parameters map[string]interface{}) (storage.StorageDriver, error) { +func FromParameters(parameters map[string]interface{}) (storage.Driver, error) { dsn := parameters["dsn"] if dsn == nil { dsn = "" @@ -184,7 +184,7 @@ func FromParameters(parameters map[string]interface{}) (storage.StorageDriver, e } // New constructs a new Driver -func New(params DriverParameters) (storage.StorageDriver, error) { +func New(params DriverParameters) (storage.Driver, error) { if params.DSN == "" { return nil, fmt.Errorf("the dsn parameter should not be empty") } @@ -242,6 +242,24 @@ func (driver *driver) FindGlobalSessions(statuses []apis.GlobalSession_GlobalSta return globalSessions } +// Find global sessions list with addressing identities +func (driver *driver) FindGlobalSessionsWithAddressingIdentities(statuses []apis.GlobalSession_GlobalStatus, + addressingIdentities []string) []*apis.GlobalSession { + var globalSessions []*apis.GlobalSession + err := driver.engine.Table(driver.globalTable). + Where(builder. + In("status", statuses). + And(builder.In("addressing", addressingIdentities))). + OrderBy("gmt_modified"). + Limit(driver.queryLimit). + Find(&globalSessions) + + if err != nil { + log.Errorf(err.Error()) + } + return globalSessions +} + // All sessions collection. func (driver *driver) AllSessions() []*apis.GlobalSession { var globalSessions []*apis.GlobalSession diff --git a/pkg/tc/storage/row_locker.go b/pkg/tc/storage/row_locker.go index 9aa09f99..4a1c2efa 100644 --- a/pkg/tc/storage/row_locker.go +++ b/pkg/tc/storage/row_locker.go @@ -8,7 +8,7 @@ import ( "github.com/opentrx/seata-golang/v2/pkg/util/common" ) -const LOCK_SPLIT = "^^^" +const LockSplit = "^^^" func CollectBranchSessionRowLocks(branchSession *apis.BranchSession) []*apis.RowLock { if branchSession == nil || branchSession.LockKey == "" { diff --git a/pkg/tc/storage/storagedriver.go b/pkg/tc/storage/storagedriver.go index 8347fd3c..eb9342d5 100644 --- a/pkg/tc/storage/storagedriver.go +++ b/pkg/tc/storage/storagedriver.go @@ -15,6 +15,9 @@ type SessionManager interface { // Find global sessions list. FindGlobalSessions(statuses []apis.GlobalSession_GlobalStatus) []*apis.GlobalSession + // Find global sessions list with addressing identities + FindGlobalSessionsWithAddressingIdentities(statuses []apis.GlobalSession_GlobalStatus, addressingIdentities []string) []*apis.GlobalSession + // All sessions collection. AllSessions() []*apis.GlobalSession @@ -54,7 +57,7 @@ type LockManager interface { IsLockable(xid string, resourceID string, lockKey string) bool } -type StorageDriver interface { +type Driver interface { SessionManager LockManager } diff --git a/pkg/util/log/logging.go b/pkg/util/log/logging.go index 15a7e822..34192d1f 100644 --- a/pkg/util/log/logging.go +++ b/pkg/util/log/logging.go @@ -11,27 +11,27 @@ import ( ) // Level represents the level of logging. -type LogLevel int8 +type Level int8 const ( // DebugLevel logs are typically voluminous, and are usually disabled in // production. - DebugLevel = LogLevel(zapcore.DebugLevel) + DebugLevel = Level(zapcore.DebugLevel) // InfoLevel is the default logging priority. - InfoLevel = LogLevel(zapcore.InfoLevel) + InfoLevel = Level(zapcore.InfoLevel) // WarnLevel logs are more important than Info, but don't need individual // human review. - WarnLevel = LogLevel(zapcore.WarnLevel) + WarnLevel = Level(zapcore.WarnLevel) // ErrorLevel logs are high-priority. If an application is running smoothly, // it shouldn't generate any error-level logs. - ErrorLevel = LogLevel(zapcore.ErrorLevel) + ErrorLevel = Level(zapcore.ErrorLevel) // PanicLevel logs a message, then panics. - PanicLevel = LogLevel(zapcore.PanicLevel) + PanicLevel = Level(zapcore.PanicLevel) // FatalLevel logs a message, then calls os.Exit(1). - FatalLevel = LogLevel(zapcore.FatalLevel) + FatalLevel = Level(zapcore.FatalLevel) ) -func (l *LogLevel) UnmarshalText(text []byte) error { +func (l *Level) UnmarshalText(text []byte) error { if l == nil { return errors.New("can't unmarshal a nil *Level") } @@ -41,7 +41,7 @@ func (l *LogLevel) UnmarshalText(text []byte) error { return nil } -func (l *LogLevel) unmarshalText(text []byte) bool { +func (l *Level) unmarshalText(text []byte) bool { switch string(text) { case "debug", "DEBUG": *l = DebugLevel @@ -106,7 +106,7 @@ func init() { log = zapLogger.Sugar() } -func Init(logPath string, level LogLevel) { +func Init(logPath string, level Level) { lumberJackLogger := &lumberjack.Logger{ Filename: logPath, MaxSize: 10, diff --git a/pkg/util/mysql/mysql_keyword_checker.go b/pkg/util/mysql/mysql_keyword_checker.go index 429ef8d6..a391f661 100644 --- a/pkg/util/mysql/mysql_keyword_checker.go +++ b/pkg/util/mysql/mysql_keyword_checker.go @@ -287,7 +287,6 @@ func CheckEscape(fieldOrTableName string) bool { func CheckAndReplace(fieldOrTableName string) string { if Check(fieldOrTableName) { return "`" + fieldOrTableName + "`" - } else { - return fieldOrTableName } + return fieldOrTableName } diff --git a/pkg/util/sql/sql_type.go b/pkg/util/sql/sql_type.go index 1bfa2dee..d4a10a1f 100644 --- a/pkg/util/sql/sql_type.go +++ b/pkg/util/sql/sql_type.go @@ -4,10 +4,10 @@ import "strings" // refer to [Types](java.sql.Types) -type SqlType int32 +type Type int32 const ( - BIT SqlType = -7 + BIT Type = -7 TINYINT = -6 @@ -49,7 +49,7 @@ const ( OTHER = 1111 - JAVA_OBJECT = 2000 + JavaObject = 2000 DISTINCT = 2001 @@ -79,14 +79,14 @@ const ( SQLXML = 2009 - REF_CURSOR = 2012 + RefCursor = 2012 - TIME_WITH_TIMEZONE = 2013 + TimeWithTimezone = 2013 - TIMESTAMP_WITH_TIMEZONE = 2014 + TimestampWithTimezone = 2014 ) -var SqlTypes = map[string]int32{ +var SQLTypes = map[string]int32{ "BIT": -7, "TINYINT": -6, "SMALLINT": 5, @@ -128,6 +128,6 @@ var SqlTypes = map[string]int32{ "TIMESTAMP_WITH_TIMEZONE": 2014, } -func GetSqlType(dataType string) int32 { - return SqlTypes[strings.ToUpper(dataType)] +func GetSQLType(dataType string) int32 { + return SQLTypes[strings.ToUpper(dataType)] } diff --git a/pkg/util/uuid/id_worker.go b/pkg/util/uuid/id_worker.go index d0984c48..3ab9ffd3 100644 --- a/pkg/util/uuid/id_worker.go +++ b/pkg/util/uuid/id_worker.go @@ -33,7 +33,7 @@ const ( // highest 11 bit: not used // middle 41 bit: timestamp // lowest 12 bit: sequence -var timestampAndSequence uint64 = 0 +var timestampAndSequence uint64 // business meaning: machine ID (0 ~ 1023) // actual layout in memory: @@ -99,7 +99,7 @@ func generateWorkerIDBaseOnMac() (int64, error) { mac := iface.HardwareAddr - return int64(int((mac[4]&0b11)<<8) | int(mac[5]&0xFF)), nil + return int64(int(rune(mac[4]&0b11)<<8) | int(mac[5]&0xFF)), nil } return 0, fmt.Errorf("no available mac found") }