From 16f9ec690be5e922f39a1ebb3eb631feb233d6cd Mon Sep 17 00:00:00 2001 From: 9seconds Date: Thu, 6 May 2021 22:00:27 +0300 Subject: [PATCH 1/3] Fix race condition in closing a relay This commit fixes a situration when relay can be reset before all waiting goroutines are finished. For example, we terminate processing based on some event: socket error etc. So, error happens and context is cancelled. After that a main relay goroutine starts to wait. Meanwhile a second goroutine reaches deferred function and set wg to done. It means that main goroutine can continue. In this case this is really possible that we can start resetting before transmit goroutine really exits. A correct solution is to always do wg.Done() as a first deferred thing on entering to a function. In that case we do not need reordering and so on. --- mtglib/internal/relay/relay.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mtglib/internal/relay/relay.go b/mtglib/internal/relay/relay.go index a9e105a..04cda40 100644 --- a/mtglib/internal/relay/relay.go +++ b/mtglib/internal/relay/relay.go @@ -68,11 +68,12 @@ func (r *Relay) Process(eastConn, westConn io.ReadWriteCloser) error { func (r *Relay) transmit(src io.ReadCloser, dst io.WriteCloser, buffer []byte, direction string, wg *sync.WaitGroup) { + defer wg.Done() + defer func() { + r.ctxCancel() src.Close() dst.Close() - wg.Done() - r.ctxCancel() }() if _, err := io.CopyBuffer(dst, src, buffer); err != nil { @@ -92,6 +93,8 @@ func (r *Relay) transmit(src io.ReadCloser, dst io.WriteCloser, } func (r *Relay) runObserver(one, another io.Closer, wg *sync.WaitGroup) { + defer wg.Done() + ticker := time.NewTicker(time.Second) defer func() { @@ -104,8 +107,6 @@ func (r *Relay) runObserver(one, another io.Closer, wg *sync.WaitGroup) { case <-ticker.C: default: } - - wg.Done() }() lastTickAt := time.Now() From 604b1d259774d9d7fdb8abe719a993b1781e3232 Mon Sep 17 00:00:00 2001 From: 9seconds Date: Fri, 7 May 2021 16:23:31 +0300 Subject: [PATCH 2/3] Add support of goreleaser --- .gitignore | 1 + .goreleaser.yml | 65 +++++++++++++++++++++++++++++++++++++++++++++++++ Makefile | 49 +++++++++++++++---------------------- 3 files changed, 86 insertions(+), 29 deletions(-) create mode 100644 .goreleaser.yml diff --git a/.gitignore b/.gitignore index ef266e3..d645be9 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ vendor/ ccbuilds/ .bin/ coverage.txt +dist/ diff --git a/.goreleaser.yml b/.goreleaser.yml new file mode 100644 index 0000000..9d6a010 --- /dev/null +++ b/.goreleaser.yml @@ -0,0 +1,65 @@ +--- + +project_name: mtg + +before: + hooks: + - go mod tidy + - go generate ./... + +builds: + - binary: '{{ .ProjectName }}' + goos: + - darwin + - freebsd + - linux + - netbsd + - openbsd + goarch: + - 386 + - amd64 + - arm + - arm64 + goarm: + - 6 + - 7 + env: + - CGO_ENABLED=0 + flags: + - -trimpath + - -mod=readonly + ldflags: -s -w -X main.version={{ .Version }} + ignore: + - goos: darwin + goarch: 386 + - goos: freebsd + goarch: arm64 + - goos: netbsd + goarch: arm64 + - goos: openbsd + goarch: arm64 + +archives: + - name_template: '{{ .ProjectName }}-{{ .Version }}-{{ .Os }}-{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}' + format: tar.gz + wrap_in_directory: true + format_overrides: + - goos: windows + format: zip + files: + - LICENSE + - README.md + - SECURITY.md + +gomod: + proxy: true + +snapshot: + name_template: '{{ .Version }}' + +checksum: + name_template: '{{ .ProjectName }}-{{ .Version }}-checksums.txt' + +source: + enabled: true + name_template: '{{ .ProjectName }}-sources' diff --git a/Makefile b/Makefile index 71f290a..edba1fe 100644 --- a/Makefile +++ b/Makefile @@ -2,8 +2,6 @@ ROOT_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) IMAGE_NAME := mtg APP_NAME := $(IMAGE_NAME) -CC_BINARIES := $(shell bash -c "echo -n $(APP_NAME)-{linux,freebsd,openbsd}-{386,amd64} $(APP_NAME)-linux-{arm,arm64}") - GOLANGCI_LINT_VERSION := v1.39.0 VERSION_GO := $(shell go version) @@ -33,23 +31,12 @@ static: -a \ -o "$(APP_NAME)" -$(APP_NAME)-%: GOOS=$(shell echo -n "$@" | sed 's?$(APP_NAME)-??' | cut -f1 -d-) -$(APP_NAME)-%: GOARCH=$(shell echo -n "$@" | sed 's?$(APP_NAME)-??' | cut -f2 -d-) -$(APP_NAME)-%: ccbuilds - @env "GOOS=$(GOOS)" "GOARCH=$(GOARCH)" \ - go build \ - $(COMMON_BUILD_FLAGS) \ - -tags netgo \ - -a \ - -o "./ccbuilds/$(APP_NAME)-$(GOOS)-$(GOARCH)" - -.PHONY: ccbuilds -ccbuilds: - @rm -rf ./ccbuilds && mkdir -p ./ccbuilds - vendor: go.mod go.sum @$(MOD_ON) go mod vendor +.bin: + @mkdir -p "$(GOBIN)" || true + .PHONY: fmt fmt: @$(GOTOOL) gofumpt -w -s -extra "$(ROOT_DIR)" @@ -62,9 +49,6 @@ test: citest: @go test -coverprofile=coverage.txt -covermode=atomic -parallel 2 -race -v ./... -.PHONY: crosscompile -crosscompile: $(CC_BINARIES) - .PHONY: clean clean: @git clean -xfd && \ @@ -75,6 +59,12 @@ clean: lint: @$(GOTOOL) golangci-lint run +.PHONY: release +release: + @$(GOTOOL) goreleaser release --snapshot --rm-dist && \ + find "$(ROOT_DIR)/dist" -type d | grep -vP "dist$$" | xargs -r rm -rf && \ + rm -f "$(ROOT_DIR)/dist/config.yaml" + .PHONY: docker docker: @docker build --pull -t "$(IMAGE_NAME)" "$(ROOT_DIR)" @@ -84,23 +74,24 @@ doc: @$(GOTOOL) godoc -http 0.0.0.0:10000 .PHONY: install-tools -install-tools: install-tools-lint install-tools-godoc install-tools-gofumpt +install-tools: install-tools-lint install-tools-godoc install-tools-gofumpt install-tools-goreleaser .PHONY: install-tools-lint -install-tools-lint: - @mkdir -p "$(GOBIN)" || true && \ - curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh \ +install-tools-lint: .bin + @curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh \ | bash -s -- -b "$(GOBIN)" "$(GOLANGCI_LINT_VERSION)" .PHONY: install-tools-godoc -install-tools-godoc: - @mkdir -p "$(GOBIN)" || true && \ - $(GOTOOL) go get -u golang.org/x/tools/cmd/godoc +install-tools-godoc: .bin + @$(GOTOOL) go get -u golang.org/x/tools/cmd/godoc .PHONY: install-tools-gofumpt -install-tools-gofumpt: - @mkdir -p "$(GOBIN)" || true && \ - $(GOTOOL) go get -u mvdan.cc/gofumpt +install-tools-gofumpt: .bin + @$(GOTOOL) go get -u mvdan.cc/gofumpt + +.PHONY: goreleaser +install-tools-goreleaser: .bin + @$(GOTOOL) go get -u github.com/goreleaser/goreleaser .PHONY: update-deps update-deps: From 4c8925ab65082e1273fbe55cbb5a8bf3ed68d9c0 Mon Sep 17 00:00:00 2001 From: 9seconds Date: Mon, 17 May 2021 12:13:17 +0300 Subject: [PATCH 3/3] Update depdendencies --- go.mod | 12 ++++++------ go.sum | 24 ++++++++++++------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/go.mod b/go.mod index 3e81185..17569d9 100644 --- a/go.mod +++ b/go.mod @@ -16,16 +16,16 @@ require ( github.com/libp2p/go-reuseport v0.0.2 github.com/mccutchen/go-httpbin v1.1.1 github.com/panjf2000/ants/v2 v2.4.4 - github.com/pelletier/go-toml v1.9.0 + github.com/pelletier/go-toml v1.9.1 github.com/prometheus/client_golang v1.10.0 - github.com/prometheus/common v0.23.0 // indirect - github.com/rs/zerolog v1.21.0 + github.com/prometheus/common v0.24.0 // indirect + github.com/rs/zerolog v1.22.0 github.com/smira/go-statsd v1.3.2 github.com/stretchr/objx v0.3.0 // indirect github.com/stretchr/testify v1.7.0 github.com/tylertreat/BoomFilters v0.0.0-20210315201527-1a82519a3e43 github.com/xeipuuv/gojsonschema v1.2.0 - golang.org/x/crypto v0.0.0-20210503195802-e9a32991a82e - golang.org/x/net v0.0.0-20210505024714-0287a6fb4125 - golang.org/x/sys v0.0.0-20210503173754-0981d6026fa6 + golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a + golang.org/x/net v0.0.0-20210510120150-4163338589ed + golang.org/x/sys v0.0.0-20210514084401-e8d321eab015 ) diff --git a/go.sum b/go.sum index 7b230b9..386a1f1 100644 --- a/go.sum +++ b/go.sum @@ -245,8 +245,8 @@ github.com/panjf2000/ants/v2 v2.4.4 h1:kebk2KSiXHGeiYS6b+w2RqNN5+IKoqlBNd7cuC7Mv github.com/panjf2000/ants/v2 v2.4.4/go.mod h1:f6F0NZVFsGCp5A7QW/Zj/m92atWwOkY0OIhFxRNFr4A= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.9.0 h1:NOd0BRdOKpPf0SxkL3HxSQOG7rNh+4kl6PHcBPFs7Q0= -github.com/pelletier/go-toml v1.9.0/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml v1.9.1 h1:a6qW1EVNZWH9WGI6CsYdD8WAylkoXBS5yv0XHlh17Tc= +github.com/pelletier/go-toml v1.9.1/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= 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= @@ -278,8 +278,8 @@ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= -github.com/prometheus/common v0.23.0 h1:GXWvPYuTUenIa+BhOq/x+L/QZzCqASkVRny5KTlPDGM= -github.com/prometheus/common v0.23.0/go.mod h1:H6QK/N6XVT42whUeIdI3dp36w49c+/iMDk7UAI2qm7Q= +github.com/prometheus/common v0.24.0 h1:aIycr3wRFxPUq8XlLQlGQ9aNXV3dFi5y62pe/SB262k= +github.com/prometheus/common v0.24.0/go.mod h1:H6QK/N6XVT42whUeIdI3dp36w49c+/iMDk7UAI2qm7Q= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -293,8 +293,8 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/zerolog v1.21.0 h1:Q3vdXlfLNT+OftyBHsU0Y445MD+8m8axjKgf2si0QcM= -github.com/rs/zerolog v1.21.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM= +github.com/rs/zerolog v1.22.0 h1:XrVUjV4K+izZpKXZHlPrYQiDtmdGiCylnT4i43AAWxg= +github.com/rs/zerolog v1.22.0/go.mod h1:ZPhntP/xmq1nnND05hhpAh2QMhSsA4UN3MGZ6O2J3hM= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 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= @@ -371,8 +371,8 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U 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/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210503195802-e9a32991a82e h1:8foAy0aoO5GkqCvAEJ4VC4P3zksTg4X4aJCDpZzmgQI= -golang.org/x/crypto v0.0.0-20210503195802-e9a32991a82e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrOcgcReGTfbE9N577tCTuBc= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -405,8 +405,8 @@ golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210505024714-0287a6fb4125 h1:Ugb8sMTWuWRC3+sz5WeN/4kejDx9BvIwnPUiJBjJE+8= -golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210510120150-4163338589ed h1:p9UgmWI9wKpfYmgaV/IZKGdXc5qEK45tDwwwDyjS26I= +golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -447,8 +447,8 @@ golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210503173754-0981d6026fa6 h1:cdsMqa2nXzqlgs183pHxtvoVwU7CyzaCTAUOg94af4c= -golang.org/x/sys v0.0.0-20210503173754-0981d6026fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015 h1:hZR0X1kPW+nwyJ9xRxqZk1vx5RUObAPBdKVvXPDUH/E= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=