# Conflicts: # .github/workflows/main.ymlpull/69/head
| @@ -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 | |||
| @@ -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 | |||
| @@ -20,4 +20,5 @@ root.data.1 | |||
| trace.out | |||
| cmd/tc/cmd | |||
| cmd/tc/tc | |||
| cmd/tc/trace.out | |||
| cmd/tc/trace.out | |||
| dist/tc | |||
| @@ -0,0 +1,18 @@ | |||
| run: | |||
| deadline: 5m | |||
| linters: | |||
| disable-all: true | |||
| enable: | |||
| - deadcode | |||
| - errcheck | |||
| - gosimple | |||
| - govet | |||
| - ineffassign | |||
| - staticcheck | |||
| - structcheck | |||
| - typecheck | |||
| - varcheck | |||
| - goimports | |||
| - gocritic | |||
| - revive | |||
| @@ -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 | |||
| @@ -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 | |||
| @@ -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 | |||
| } | |||
| @@ -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"] | |||
| @@ -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 | |||
| @@ -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 | |||
| @@ -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= | |||
| @@ -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 | |||
| @@ -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); | |||
| } | |||
| @@ -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", | |||
| } | |||
| @@ -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 | |||
| @@ -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) | |||
| } | |||
| @@ -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 | |||
| } | |||
| @@ -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 | |||
| } | |||
| @@ -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(), | |||
| } | |||
| } | |||
| @@ -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 { | |||
| @@ -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{}) | |||
| } | |||
| @@ -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 { | |||
| @@ -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) | |||
| @@ -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 | |||
| @@ -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), | |||
| } | |||
| } | |||
| @@ -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{} | |||
| @@ -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 | |||
| } | |||
| @@ -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 | |||
| } | |||
| @@ -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) | |||
| @@ -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) | |||
| } | |||
| }() | |||
| } | |||
| @@ -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 | |||
| @@ -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 | |||
| } | |||
| @@ -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 { | |||
| @@ -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) | |||
| } | |||
| @@ -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) | |||
| @@ -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 { | |||
| @@ -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 | |||
| @@ -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 == "" { | |||
| @@ -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 | |||
| } | |||
| @@ -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, | |||
| @@ -287,7 +287,6 @@ func CheckEscape(fieldOrTableName string) bool { | |||
| func CheckAndReplace(fieldOrTableName string) string { | |||
| if Check(fieldOrTableName) { | |||
| return "`" + fieldOrTableName + "`" | |||
| } else { | |||
| return fieldOrTableName | |||
| } | |||
| return fieldOrTableName | |||
| } | |||
| @@ -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)] | |||
| } | |||
| @@ -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") | |||
| } | |||