diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 30c86ffb8..df2c01479 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,21 +6,21 @@ on: jobs: test: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest timeout-minutes: 30 strategy: fail-fast: false matrix: - go: ["1.21.x", "1.22.x", "1.23.x"] + go: ["1.26.x", "1.25.x"] arch: ["amd64", "386"] env: GOARCH: "${{matrix.arch}}" steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v7 - - uses: WillAbides/setup-go-faster@v1.7.0 + - uses: WillAbides/setup-go-faster@v1 with: go-version: ${{matrix.go}} @@ -31,24 +31,31 @@ jobs: run: ./test.sh staticcheck: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - - uses: dominikh/staticcheck-action@v1.3.1 + - uses: actions/checkout@v7 + - uses: actions/setup-go@v7 + with: + go-version: stable + - name: golangci-lint + uses: golangci/golangci-lint-action@v9 with: - version: "2024.1.1" - install-go: false + version: v2.12 code-coverage: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v7 - - name: install goveralls - run: go install github.com/mattn/goveralls@latest + - uses: actions/setup-go@v7 + with: + go-version: stable + + - name: generate coverage + run: go test -covermode=count -coverprofile=coverage.out ./... - name: send coverage - env: - COVERALLS_TOKEN: ${{secrets.GITHUB_TOKEN}} - run: ./coverage.sh --coveralls + uses: coverallsapp/github-action@v2 + with: + file: coverage.out + format: golang diff --git a/apps/nsq_tail/nsq_tail.go b/apps/nsq_tail/nsq_tail.go index 65470c428..0ede6a107 100644 --- a/apps/nsq_tail/nsq_tail.go +++ b/apps/nsq_tail/nsq_tail.go @@ -8,7 +8,6 @@ import ( "os" "os/signal" "syscall" - "time" "github.com/nsqio/go-nsq" "github.com/nsqio/nsq/internal/app" @@ -71,7 +70,7 @@ func (th *TailHandler) HandleMessage(m *nsq.Message) error { func main() { cfg := nsq.NewConfig() - flag.Var(&nsq.ConfigFlag{cfg}, "consumer-opt", "option to passthrough to nsq.Consumer (may be given multiple times, http://godoc.org/github.com/nsqio/go-nsq#Config)") + flag.Var(&nsq.ConfigFlag{Config: cfg}, "consumer-opt", "option to passthrough to nsq.Consumer (may be given multiple times, http://godoc.org/github.com/nsqio/go-nsq#Config)") flag.Parse() if *showVersion { @@ -80,7 +79,6 @@ func main() { } if *channel == "" { - rand.Seed(time.Now().UnixNano()) *channel = fmt.Sprintf("tail%06d#ephemeral", rand.Int()%999999) } diff --git a/apps/nsq_to_file/file_logger.go b/apps/nsq_to_file/file_logger.go index ae16b4082..e035b5da3 100644 --- a/apps/nsq_to_file/file_logger.go +++ b/apps/nsq_to_file/file_logger.go @@ -207,7 +207,7 @@ func (f *FileLogger) Close() { for i := f.rev + 1; ; i++ { f.logf(lg.WARN, "[%s/%s] destination file already exists: %s", f.topic, f.opts.Channel, dst) - dst := strings.Replace(dstTmpl, "", fmt.Sprintf("-%06d", i), -1) + dst := strings.ReplaceAll(dstTmpl, "", fmt.Sprintf("-%06d", i)) err := exclusiveRename(src, dst) if err != nil { if os.IsExist(err) { @@ -251,7 +251,7 @@ func (f *FileLogger) Sync() error { func (f *FileLogger) currentFilename() string { t := time.Now() datetime := strftime(f.opts.DatetimeFormat, t) - return strings.Replace(f.filenameFormat, "", datetime, -1) + return strings.ReplaceAll(f.filenameFormat, "", datetime) } func (f *FileLogger) needsRotation() bool { @@ -302,7 +302,7 @@ func (f *FileLogger) updateFile() { var fi os.FileInfo for ; ; f.rev++ { - absFilename := strings.Replace(fullPath, "", fmt.Sprintf("-%06d", f.rev), -1) + absFilename := strings.ReplaceAll(fullPath, "", fmt.Sprintf("-%06d", f.rev)) // If we're using a working directory for in-progress files, // proactively check for duplicate file names in the output dir to @@ -397,8 +397,8 @@ func computeFilenameFormat(opts *Options, topic string) (string, error) { identifier := shortHostname if len(opts.HostIdentifier) != 0 { - identifier = strings.Replace(opts.HostIdentifier, "", shortHostname, -1) - identifier = strings.Replace(identifier, "", hostname, -1) + identifier = strings.ReplaceAll(opts.HostIdentifier, "", shortHostname) + identifier = strings.ReplaceAll(identifier, "", hostname) } cff := opts.FilenameFormat @@ -408,11 +408,11 @@ func computeFilenameFormat(opts *Options, topic string) (string, error) { } } else { // remove as we don't need it - cff = strings.Replace(cff, "", "", -1) + cff = strings.ReplaceAll(cff, "", "") } - cff = strings.Replace(cff, "", topic, -1) - cff = strings.Replace(cff, "", identifier, -1) - cff = strings.Replace(cff, "", fmt.Sprintf("%d", os.Getpid()), -1) + cff = strings.ReplaceAll(cff, "", topic) + cff = strings.ReplaceAll(cff, "", identifier) + cff = strings.ReplaceAll(cff, "", fmt.Sprintf("%d", os.Getpid())) if opts.GZIP && !strings.HasSuffix(cff, ".gz") { cff = cff + ".gz" } diff --git a/apps/nsq_to_file/nsq_to_file.go b/apps/nsq_to_file/nsq_to_file.go index be4120ea1..29025638a 100644 --- a/apps/nsq_to_file/nsq_to_file.go +++ b/apps/nsq_to_file/nsq_to_file.go @@ -60,7 +60,9 @@ func flagSet() *flag.FlagSet { func main() { fs := flagSet() - fs.Parse(os.Args[1:]) + if err := fs.Parse(os.Args[1:]); err != nil { + log.Fatal(err) + } if args := fs.Args(); len(args) > 0 { log.Fatalf("unknown arguments: %s", args) @@ -119,9 +121,11 @@ func main() { } cfg := nsq.NewConfig() - cfgFlag := nsq.ConfigFlag{cfg} + cfgFlag := nsq.ConfigFlag{Config: cfg} for _, opt := range opts.ConsumerOpts { - cfgFlag.Set(opt) + if err := cfgFlag.Set(opt); err != nil { + log.Fatal(err) + } } cfg.UserAgent = fmt.Sprintf("nsq_to_file/%s go-nsq/%s", version.Binary, nsq.VERSION) cfg.MaxInFlight = opts.MaxInFlight diff --git a/apps/nsq_to_http/nsq_to_http.go b/apps/nsq_to_http/nsq_to_http.go index 22ab5abc3..568b0ec9a 100644 --- a/apps/nsq_to_http/nsq_to_http.go +++ b/apps/nsq_to_http/nsq_to_http.go @@ -129,8 +129,13 @@ func (p *PostPublisher) Publish(addr string, msg []byte) error { if err != nil { return err } - io.Copy(io.Discard, resp.Body) - resp.Body.Close() + if _, err := io.Copy(io.Discard, resp.Body); err != nil { + _ = resp.Body.Close() + return err + } + if err := resp.Body.Close(); err != nil { + return err + } if resp.StatusCode < 200 || resp.StatusCode >= 300 { return fmt.Errorf("got status code %d", resp.StatusCode) @@ -146,8 +151,13 @@ func (p *GetPublisher) Publish(addr string, msg []byte) error { if err != nil { return err } - io.Copy(io.Discard, resp.Body) - resp.Body.Close() + if _, err := io.Copy(io.Discard, resp.Body); err != nil { + _ = resp.Body.Close() + return err + } + if err := resp.Body.Close(); err != nil { + return err + } if resp.StatusCode != 200 { return fmt.Errorf("got status code %d", resp.StatusCode) @@ -162,7 +172,7 @@ func main() { cfg := nsq.NewConfig() - flag.Var(&nsq.ConfigFlag{cfg}, "consumer-opt", "option to passthrough to nsq.Consumer (may be given multiple times, http://godoc.org/github.com/nsqio/go-nsq#Config)") + flag.Var(&nsq.ConfigFlag{Config: cfg}, "consumer-opt", "option to passthrough to nsq.Consumer (may be given multiple times, http://godoc.org/github.com/nsqio/go-nsq#Config)") flag.Parse() httpclient = &http.Client{Transport: http_api.NewDeadlineTransport(*httpConnectTimeout, *httpRequestTimeout), Timeout: *httpRequestTimeout} diff --git a/apps/nsq_to_nsq/nsq_to_nsq.go b/apps/nsq_to_nsq/nsq_to_nsq.go index 4d59121c0..426ffca28 100644 --- a/apps/nsq_to_nsq/nsq_to_nsq.go +++ b/apps/nsq_to_nsq/nsq_to_nsq.go @@ -260,8 +260,8 @@ func main() { cCfg := nsq.NewConfig() pCfg := nsq.NewConfig() - flag.Var(&nsq.ConfigFlag{cCfg}, "consumer-opt", "option to passthrough to nsq.Consumer (may be given multiple times, see http://godoc.org/github.com/nsqio/go-nsq#Config)") - flag.Var(&nsq.ConfigFlag{pCfg}, "producer-opt", "option to passthrough to nsq.Producer (may be given multiple times, see http://godoc.org/github.com/nsqio/go-nsq#Config)") + flag.Var(&nsq.ConfigFlag{Config: cCfg}, "consumer-opt", "option to passthrough to nsq.Consumer (may be given multiple times, see http://godoc.org/github.com/nsqio/go-nsq#Config)") + flag.Var(&nsq.ConfigFlag{Config: pCfg}, "producer-opt", "option to passthrough to nsq.Producer (may be given multiple times, see http://godoc.org/github.com/nsqio/go-nsq#Config)") flag.Parse() diff --git a/apps/nsqadmin/main.go b/apps/nsqadmin/main.go index ef7ebe4be..4396f1066 100644 --- a/apps/nsqadmin/main.go +++ b/apps/nsqadmin/main.go @@ -87,7 +87,9 @@ func (p *program) Start() error { opts := nsqadmin.NewOptions() flagSet := nsqadminFlagSet(opts) - flagSet.Parse(os.Args[1:]) + if err := flagSet.Parse(os.Args[1:]); err != nil { + return err + } if flagSet.Lookup("version").Value.(flag.Getter).Get().(bool) { fmt.Println(version.String("nsqadmin")) @@ -114,7 +116,9 @@ func (p *program) Start() error { go func() { err := p.nsqadmin.Main() if err != nil { - p.Stop() + if stopErr := p.Stop(); stopErr != nil { + logFatal("failed to stop nsqadmin - %s", stopErr) + } os.Exit(1) } }() diff --git a/apps/nsqadmin/main_test.go b/apps/nsqadmin/main_test.go index 6c39c8d75..7e345eab6 100644 --- a/apps/nsqadmin/main_test.go +++ b/apps/nsqadmin/main_test.go @@ -14,7 +14,10 @@ func TestConfigFlagParsing(t *testing.T) { opts.Logger = test.NewTestLogger(t) flagSet := nsqadminFlagSet(opts) - flagSet.Parse([]string{}) + err := flagSet.Parse([]string{}) + if err != nil { + t.Fatalf("%s", err) + } cfg := config{"log_level": "debug"} cfg.Validate() diff --git a/apps/nsqd/main.go b/apps/nsqd/main.go index a5cf2aee0..30a5fba3b 100644 --- a/apps/nsqd/main.go +++ b/apps/nsqd/main.go @@ -4,11 +4,9 @@ import ( "context" "flag" "fmt" - "math/rand" "os" "sync" "syscall" - "time" "github.com/BurntSushi/toml" "github.com/judwhite/go-svc" @@ -34,9 +32,9 @@ func (p *program) Init(env svc.Environment) error { opts := nsqd.NewOptions() flagSet := nsqdFlagSet(opts) - flagSet.Parse(os.Args[1:]) - - rand.Seed(time.Now().UTC().UnixNano()) + if err := flagSet.Parse(os.Args[1:]); err != nil { + return err + } if flagSet.Lookup("version").Value.(flag.Getter).Get().(bool) { fmt.Println(version.String("nsqd")) @@ -78,7 +76,9 @@ func (p *program) Start() error { go func() { err := p.nsqd.Main() if err != nil { - p.Stop() + if stopErr := p.Stop(); stopErr != nil { + logFatal("failed to stop nsqd - %s", stopErr) + } os.Exit(1) } }() diff --git a/apps/nsqd/main_test.go b/apps/nsqd/main_test.go index bef345eed..0d019afbf 100644 --- a/apps/nsqd/main_test.go +++ b/apps/nsqd/main_test.go @@ -17,20 +17,33 @@ func TestConfigFlagParsing(t *testing.T) { opts.Logger = test.NewTestLogger(t) flagSet := nsqdFlagSet(opts) - flagSet.Parse([]string{}) + err := flagSet.Parse([]string{}) + if err != nil { + t.Fatalf("%s", err) + } var cfg config f, err := os.Open("../../contrib/nsqd.cfg.example") if err != nil { t.Fatalf("%s", err) } - defer f.Close() - toml.NewDecoder(f).Decode(&cfg) + defer func() { + if err := f.Close(); err != nil { + t.Fatalf("%s", err) + } + }() + _, err = toml.NewDecoder(f).Decode(&cfg) + if err != nil { + t.Fatalf("%s", err) + } cfg["log_level"] = "debug" cfg.Validate() options.Resolve(opts, flagSet, cfg) - nsqd.New(opts) + _, err = nsqd.New(opts) + if err != nil { + t.Fatalf("%s", err) + } if opts.TLSMinVersion != tls.VersionTLS10 { t.Errorf("min %#v not expected %#v", opts.TLSMinVersion, tls.VersionTLS10) diff --git a/apps/nsqlookupd/main.go b/apps/nsqlookupd/main.go index 76c9dcd59..c45f649ca 100644 --- a/apps/nsqlookupd/main.go +++ b/apps/nsqlookupd/main.go @@ -61,7 +61,9 @@ func (p *program) Start() error { opts := nsqlookupd.NewOptions() flagSet := nsqlookupdFlagSet(opts) - flagSet.Parse(os.Args[1:]) + if err := flagSet.Parse(os.Args[1:]); err != nil { + return err + } if flagSet.Lookup("version").Value.(flag.Getter).Get().(bool) { fmt.Println(version.String("nsqlookupd")) @@ -88,7 +90,9 @@ func (p *program) Start() error { go func() { err := p.nsqlookupd.Main() if err != nil { - p.Stop() + if stopErr := p.Stop(); stopErr != nil { + logFatal("failed to stop nsqlookupd - %s", stopErr) + } os.Exit(1) } }() diff --git a/apps/nsqlookupd/main_test.go b/apps/nsqlookupd/main_test.go index 8f5539c39..def11c2a2 100644 --- a/apps/nsqlookupd/main_test.go +++ b/apps/nsqlookupd/main_test.go @@ -14,7 +14,10 @@ func TestConfigFlagParsing(t *testing.T) { opts.Logger = test.NewTestLogger(t) flagSet := nsqlookupdFlagSet(opts) - flagSet.Parse([]string{}) + err := flagSet.Parse([]string{}) + if err != nil { + t.Fatalf("%s", err) + } cfg := config{"log_level": "debug"} cfg.Validate() diff --git a/apps/to_nsq/to_nsq.go b/apps/to_nsq/to_nsq.go index ea55aba84..cda23a999 100644 --- a/apps/to_nsq/to_nsq.go +++ b/apps/to_nsq/to_nsq.go @@ -33,7 +33,7 @@ func init() { func main() { cfg := nsq.NewConfig() - flag.Var(&nsq.ConfigFlag{cfg}, "producer-opt", "option to passthrough to nsq.Producer (may be given multiple times, http://godoc.org/github.com/nsqio/go-nsq#Config)") + flag.Var(&nsq.ConfigFlag{Config: cfg}, "producer-opt", "option to passthrough to nsq.Producer (may be given multiple times, http://godoc.org/github.com/nsqio/go-nsq#Config)") rate := flag.Int64("rate", 0, "Throttle messages to n/second. 0 to disable") flag.Parse() diff --git a/bench/bench_channels/bench_channels.go b/bench/bench_channels/bench_channels.go index 54a196637..ce8408721 100644 --- a/bench/bench_channels/bench_channels.go +++ b/bench/bench_channels/bench_channels.go @@ -43,21 +43,42 @@ func subWorker(n int, tcpAddr string, if err != nil { panic(err.Error()) } - conn.Write(nsq.MagicV2) + _, err = conn.Write(nsq.MagicV2) + if err != nil { + panic(err.Error()) + } rw := bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn)) ci := make(map[string]interface{}) ci["client_id"] = "test" cmd, _ := nsq.Identify(ci) - cmd.WriteTo(rw) - nsq.Subscribe(topic, channel).WriteTo(rw) + _, err = cmd.WriteTo(rw) + if err != nil { + panic(err.Error()) + } + _, err = nsq.Subscribe(topic, channel).WriteTo(rw) + if err != nil { + panic(err.Error()) + } rdyCount := 1 rdy := rdyCount rdyChan <- 1 <-goChan - nsq.Ready(rdyCount).WriteTo(rw) - rw.Flush() - nsq.ReadResponse(rw) - nsq.ReadResponse(rw) + _, err = nsq.Ready(rdyCount).WriteTo(rw) + if err != nil { + panic(err.Error()) + } + err = rw.Flush() + if err != nil { + panic(err.Error()) + } + _, err = nsq.ReadResponse(rw) + if err != nil { + panic(err.Error()) + } + _, err = nsq.ReadResponse(rw) + if err != nil { + panic(err.Error()) + } for { resp, err := nsq.ReadResponse(rw) if err != nil { @@ -70,20 +91,35 @@ func subWorker(n int, tcpAddr string, if frameType == nsq.FrameTypeError { panic(string(data)) } else if frameType == nsq.FrameTypeResponse { - nsq.Nop().WriteTo(rw) - rw.Flush() + _, err = nsq.Nop().WriteTo(rw) + if err != nil { + panic(err.Error()) + } + err = rw.Flush() + if err != nil { + panic(err.Error()) + } continue } msg, err := nsq.DecodeMessage(data) if err != nil { panic(err.Error()) } - nsq.Finish(msg.ID).WriteTo(rw) + _, err = nsq.Finish(msg.ID).WriteTo(rw) + if err != nil { + panic(err.Error()) + } rdy-- if rdy == 0 { - nsq.Ready(rdyCount).WriteTo(rw) + _, err = nsq.Ready(rdyCount).WriteTo(rw) + if err != nil { + panic(err.Error()) + } rdy = rdyCount - rw.Flush() + err = rw.Flush() + if err != nil { + panic(err.Error()) + } } } } diff --git a/bench/bench_reader/bench_reader.go b/bench/bench_reader/bench_reader.go index 5b4573394..ebb909fb5 100644 --- a/bench/bench_reader/bench_reader.go +++ b/bench/bench_reader/bench_reader.go @@ -73,25 +73,46 @@ func subWorker(td time.Duration, workers int, tcpAddr string, topic string, chan if err != nil { panic(err.Error()) } - conn.Write(nsq.MagicV2) + _, err = conn.Write(nsq.MagicV2) + if err != nil { + panic(err.Error()) + } rw := bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn)) ci := make(map[string]interface{}) ci["client_id"] = "reader" ci["hostname"] = "reader" ci["user_agent"] = fmt.Sprintf("bench_reader/%s", nsq.VERSION) cmd, _ := nsq.Identify(ci) - cmd.WriteTo(rw) - nsq.Subscribe(topic, channel).WriteTo(rw) + _, err = cmd.WriteTo(rw) + if err != nil { + panic(err.Error()) + } + _, err = nsq.Subscribe(topic, channel).WriteTo(rw) + if err != nil { + panic(err.Error()) + } rdyChan <- 1 <-goChan - nsq.Ready(*rdy).WriteTo(rw) - rw.Flush() - nsq.ReadResponse(rw) - nsq.ReadResponse(rw) + _, err = nsq.Ready(*rdy).WriteTo(rw) + if err != nil { + panic(err.Error()) + } + err = rw.Flush() + if err != nil { + panic(err.Error()) + } + _, err = nsq.ReadResponse(rw) + if err != nil { + panic(err.Error()) + } + _, err = nsq.ReadResponse(rw) + if err != nil { + panic(err.Error()) + } var msgCount int64 go func() { time.Sleep(td) - conn.Close() + _ = conn.Close() }() for { resp, err := nsq.ReadResponse(rw) @@ -114,10 +135,16 @@ func subWorker(td time.Duration, workers int, tcpAddr string, topic string, chan if err != nil { panic(err.Error()) } - nsq.Finish(msg.ID).WriteTo(rw) + _, err = nsq.Finish(msg.ID).WriteTo(rw) + if err != nil { + panic(err.Error()) + } msgCount++ if float64(msgCount%int64(*rdy)) > float64(*rdy)*0.75 { - rw.Flush() + err = rw.Flush() + if err != nil { + panic(err.Error()) + } } } atomic.AddInt64(&totalMsgCount, msgCount) diff --git a/bench/bench_writer/bench_writer.go b/bench/bench_writer/bench_writer.go index c4e619f3a..a92877b0c 100644 --- a/bench/bench_writer/bench_writer.go +++ b/bench/bench_writer/bench_writer.go @@ -76,18 +76,30 @@ func pubWorker(td time.Duration, tcpAddr string, batchSize int, batch [][]byte, if err != nil { panic(err.Error()) } - conn.Write(nsq.MagicV2) + _, err = conn.Write(nsq.MagicV2) + if err != nil { + panic(err.Error()) + } rw := bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn)) ci := make(map[string]interface{}) ci["client_id"] = "writer" ci["hostname"] = "writer" ci["user_agent"] = fmt.Sprintf("bench_writer/%s", nsq.VERSION) cmd, _ := nsq.Identify(ci) - cmd.WriteTo(rw) + _, err = cmd.WriteTo(rw) + if err != nil { + panic(err.Error()) + } rdyChan <- 1 <-goChan - rw.Flush() - nsq.ReadResponse(rw) + err = rw.Flush() + if err != nil { + panic(err.Error()) + } + _, err = nsq.ReadResponse(rw) + if err != nil { + panic(err.Error()) + } var msgCount int64 endTime := time.Now().Add(td) for { diff --git a/coverage.sh b/coverage.sh index de5123c78..7c04aec65 100755 --- a/coverage.sh +++ b/coverage.sh @@ -4,10 +4,11 @@ # Works around the fact that `go test -coverprofile` currently does not work # with multiple packages, see https://code.google.com/p/go/issues/detail?id=6909 # -# Usage: coverage.sh [--html|--coveralls] +# Usage: coverage.sh [--html] # # --html Additionally create HTML report -# --coveralls Push coverage statistics to coveralls.io +# +# Coverage is pushed to coveralls.io from CI via the coverallsapp/github-action. # set -e @@ -37,15 +38,7 @@ show_csv_report() { go tool cover -func="$profile" -o="$workdir"/coverage.csv } -push_to_coveralls() { - echo "Pushing coverage statistics to coveralls.io" - # ignore failure to push - it happens - $GOPATH/bin/goveralls -coverprofile="$profile" \ - -service=github \ - -ignore="nsqadmin/bindata.go" || true -} - -generate_cover_data $(go list ./... | grep -v /vendor/) +generate_cover_data $(go list ./...) show_csv_report case "$1" in @@ -53,8 +46,6 @@ case "$1" in ;; --html) show_html_report ;; ---coveralls) - push_to_coveralls ;; *) echo >&2 "error: invalid option: $1"; exit 1 ;; esac diff --git a/go.mod b/go.mod index 3b878a1c6..097e606d8 100644 --- a/go.mod +++ b/go.mod @@ -1,14 +1,14 @@ module github.com/nsqio/nsq -go 1.17 +go 1.25.0 require ( - github.com/BurntSushi/toml v1.3.2 - github.com/bitly/go-hostpool v0.1.0 + github.com/BurntSushi/toml v1.6.0 + github.com/bitly/go-hostpool v0.1.1 github.com/bitly/timer_metrics v1.0.0 - github.com/blang/semver v3.5.1+incompatible - github.com/bmizerany/perks v0.0.0-20141205001514-d9a9656a3a4b - github.com/golang/snappy v0.0.4 + github.com/blang/semver/v4 v4.0.0 + github.com/bmizerany/perks v0.0.0-20230307044200-03f9df79da1e + github.com/golang/snappy v1.0.0 github.com/judwhite/go-svc v1.2.1 github.com/julienschmidt/httprouter v1.3.0 github.com/mreiferson/go-options v1.0.0 @@ -17,8 +17,8 @@ require ( ) require ( - github.com/stretchr/testify v1.9.0 // indirect - golang.org/x/sys v0.10.0 // indirect + github.com/stretchr/testify v1.11.1 // indirect + golang.org/x/sys v0.45.0 // indirect ) replace github.com/judwhite/go-svc => github.com/mreiferson/go-svc v1.2.2-0.20210815184239-7a96e00010f6 diff --git a/go.sum b/go.sum index de81633f6..6520662dd 100644 --- a/go.sum +++ b/go.sum @@ -1,19 +1,18 @@ -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/bitly/go-hostpool v0.1.0 h1:XKmsF6k5el6xHG3WPJ8U0Ku/ye7njX7W81Ng7O2ioR0= -github.com/bitly/go-hostpool v0.1.0/go.mod h1:4gOCgp6+NZnVqlKyZ/iBZFTAJKembaVENUpMkpg42fw= +github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= +github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/bitly/go-hostpool v0.1.1 h1:SsovT4BFqgJQBAESkk2QgeeL7bqKq9oJie8JnD00R+Q= +github.com/bitly/go-hostpool v0.1.1/go.mod h1:iwXQOF7+y3cO8vituSqGpBYf02TYTzxK4S2c4rf4cJs= github.com/bitly/timer_metrics v1.0.0 h1:bbszVIl0vT5+/cdZx8L4KOQmM8mC/0y3EBICGSxyhCk= github.com/bitly/timer_metrics v1.0.0/go.mod h1:87z4/LSg3f++tMqZwZlsLwPuJu6xloyJ7Qm40NyEkLs= -github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/bmizerany/perks v0.0.0-20141205001514-d9a9656a3a4b h1:AP/Y7sqYicnjGDfD5VcY4CIfh1hRXBUavxrvELjTiOE= -github.com/bmizerany/perks v0.0.0-20141205001514-d9a9656a3a4b/go.mod h1:ac9efd0D1fsDb3EJvhqgXRbFx7bs2wqZ10HQPeU8U/Q= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= +github.com/bmizerany/perks v0.0.0-20230307044200-03f9df79da1e h1:mWOqoK5jV13ChKf/aF3plwQ96laasTJgZi4f1aSOu+M= +github.com/bmizerany/perks v0.0.0-20230307044200-03f9df79da1e/go.mod h1:ac9efd0D1fsDb3EJvhqgXRbFx7bs2wqZ10HQPeU8U/Q= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/mreiferson/go-options v1.0.0 h1:RMLidydGlDWpL+lQTXo0bVIf/XT2CTq7AEJMoz5/VWs= @@ -26,21 +25,10 @@ github.com/nsqio/go-nsq v1.1.0 h1:PQg+xxiUjA7V+TLdXw7nVrJ5Jbl3sN86EhGCQj4+FYE= github.com/nsqio/go-nsq v1.1.0/go.mod h1:vKq36oyeVXgsS5Q8YEO7WghqidAVXQlcFxzQbQTuDEY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= +golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/internal/clusterinfo/data.go b/internal/clusterinfo/data.go index 0d5b8c589..be68289c0 100644 --- a/internal/clusterinfo/data.go +++ b/internal/clusterinfo/data.go @@ -9,7 +9,7 @@ import ( "strings" "sync" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/nsqio/nsq/internal/http_api" "github.com/nsqio/nsq/internal/lg" "github.com/nsqio/nsq/internal/stringy" diff --git a/internal/clusterinfo/types.go b/internal/clusterinfo/types.go index 8a05e9f89..f9156589e 100644 --- a/internal/clusterinfo/types.go +++ b/internal/clusterinfo/types.go @@ -7,7 +7,7 @@ import ( "strconv" "time" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/nsqio/nsq/internal/quantile" ) diff --git a/internal/dirlock/dirlock.go b/internal/dirlock/dirlock.go index 4e263ace9..0d0c6c57d 100644 --- a/internal/dirlock/dirlock.go +++ b/internal/dirlock/dirlock.go @@ -34,6 +34,10 @@ func (l *DirLock) Lock() error { } func (l *DirLock) Unlock() error { - defer l.f.Close() - return syscall.Flock(int(l.f.Fd()), syscall.LOCK_UN) + err := syscall.Flock(int(l.f.Fd()), syscall.LOCK_UN) + closeErr := l.f.Close() + if err != nil { + return err + } + return closeErr } diff --git a/internal/http_api/api_request.go b/internal/http_api/api_request.go index 36042bd44..9aebc6b93 100644 --- a/internal/http_api/api_request.go +++ b/internal/http_api/api_request.go @@ -63,10 +63,13 @@ retry: } body, err := io.ReadAll(resp.Body) - resp.Body.Close() + closeErr := resp.Body.Close() if err != nil { return err } + if closeErr != nil { + return closeErr + } if resp.StatusCode != 200 { if resp.StatusCode == 403 && !strings.HasPrefix(endpoint, "https") { endpoint, err = httpsEndpoint(endpoint, body) @@ -114,10 +117,13 @@ retry: } body, err := io.ReadAll(resp.Body) - resp.Body.Close() + closeErr := resp.Body.Close() if err != nil { return err } + if closeErr != nil { + return closeErr + } if resp.StatusCode != 200 { if resp.StatusCode == 403 && !strings.HasPrefix(endpoint, "https") { endpoint, err = httpsEndpoint(endpoint, body) diff --git a/internal/http_api/api_response.go b/internal/http_api/api_response.go index c24cda345..6ac3da8b5 100644 --- a/internal/http_api/api_response.go +++ b/internal/http_api/api_response.go @@ -35,10 +35,14 @@ func PlainText(f APIHandler) APIHandler { switch d := data.(type) { case string: w.WriteHeader(code) - io.WriteString(w, d) + if _, err := io.WriteString(w, d); err != nil { + return nil, err + } case []byte: w.WriteHeader(code) - w.Write(d) + if _, err := w.Write(d); err != nil { + return nil, err + } default: panic(fmt.Sprintf("unknown response type %T", data)) } @@ -76,7 +80,9 @@ func RespondV1(w http.ResponseWriter, code int, data interface{}) { response, err = json.Marshal(data) if err != nil { code = 500 - data = err + response, _ = json.Marshal(struct { + Message string `json:"message"` + }{err.Error()}) } } } @@ -93,7 +99,7 @@ func RespondV1(w http.ResponseWriter, code int, data interface{}) { } w.Header().Set("X-NSQ-Content-Type", "nsq; version=1.0") w.WriteHeader(code) - w.Write(response) + _, _ = w.Write(response) } func Decorate(f APIHandler, ds ...Decorator) httprouter.Handle { @@ -102,7 +108,7 @@ func Decorate(f APIHandler, ds ...Decorator) httprouter.Handle { decorated = decorate(decorated) } return func(w http.ResponseWriter, req *http.Request, ps httprouter.Params) { - decorated(w, req, ps) + _, _ = decorated(w, req, ps) } } diff --git a/internal/http_api/compress.go b/internal/http_api/compress.go index ebecad9f1..db775b42b 100644 --- a/internal/http_api/compress.go +++ b/internal/http_api/compress.go @@ -50,7 +50,7 @@ func CompressHandler(h http.Handler) http.Handler { w.Header().Add("Vary", "Accept-Encoding") gw := gzip.NewWriter(w) - defer gw.Close() + defer func() { _ = gw.Close() }() h, hok := w.(http.Hijacker) if !hok { /* w is not Hijacker... oh well... */ @@ -69,7 +69,7 @@ func CompressHandler(h http.Handler) http.Handler { w.Header().Add("Vary", "Accept-Encoding") fw, _ := flate.NewWriter(w, flate.DefaultCompression) - defer fw.Close() + defer func() { _ = fw.Close() }() h, hok := w.(http.Hijacker) if !hok { /* w is not Hijacker... oh well... */ diff --git a/internal/lg/lg.go b/internal/lg/lg.go index 407739244..50e8ea1f8 100644 --- a/internal/lg/lg.go +++ b/internal/lg/lg.go @@ -77,7 +77,7 @@ func Logf(logger Logger, cfgLevel LogLevel, msgLevel LogLevel, f string, args .. if cfgLevel > msgLevel { return } - logger.Output(3, fmt.Sprintf(msgLevel.String()+": "+f, args...)) + _ = logger.Output(3, fmt.Sprintf(msgLevel.String()+": "+f, args...)) } func LogFatal(prefix string, f string, args ...interface{}) { diff --git a/internal/statsd/host.go b/internal/statsd/host.go index 85d237c5c..966f25dad 100644 --- a/internal/statsd/host.go +++ b/internal/statsd/host.go @@ -5,5 +5,5 @@ import ( ) func HostKey(h string) string { - return strings.Replace(strings.Replace(h, ".", "_", -1), ":", "_", -1) + return strings.ReplaceAll(strings.ReplaceAll(h, ".", "_"), ":", "_") } diff --git a/internal/test/assertions.go b/internal/test/assertions.go index 330dfec4b..ea2479aac 100644 --- a/internal/test/assertions.go +++ b/internal/test/assertions.go @@ -8,6 +8,7 @@ import ( ) func Equal(t *testing.T, expected, actual interface{}) { + t.Helper() if !reflect.DeepEqual(expected, actual) { _, file, line, _ := runtime.Caller(1) t.Logf("\033[31m%s:%d:\n\n\t %#v (expected)\n\n\t!= %#v (actual)\033[39m\n\n", @@ -17,6 +18,7 @@ func Equal(t *testing.T, expected, actual interface{}) { } func NotEqual(t *testing.T, expected, actual interface{}) { + t.Helper() if reflect.DeepEqual(expected, actual) { _, file, line, _ := runtime.Caller(1) t.Logf("\033[31m%s:%d:\n\n\tnexp: %#v\n\n\tgot: %#v\033[39m\n\n", @@ -26,6 +28,7 @@ func NotEqual(t *testing.T, expected, actual interface{}) { } func Nil(t *testing.T, object interface{}) { + t.Helper() if !isNil(object) { _, file, line, _ := runtime.Caller(1) t.Logf("\033[31m%s:%d:\n\n\t (expected)\n\n\t!= %#v (actual)\033[39m\n\n", @@ -35,6 +38,7 @@ func Nil(t *testing.T, object interface{}) { } func NotNil(t *testing.T, object interface{}) { + t.Helper() if isNil(object) { _, file, line, _ := runtime.Caller(1) t.Logf("\033[31m%s:%d:\n\n\tExpected value not to be \033[39m\n\n", diff --git a/internal/writers/spread_writer.go b/internal/writers/spread_writer.go index 42af812d7..0d8f9ab7a 100644 --- a/internal/writers/spread_writer.go +++ b/internal/writers/spread_writer.go @@ -40,7 +40,9 @@ func (s *SpreadWriter) Flush() { sleep := s.interval / time.Duration(len(s.buf)) ticker := time.NewTicker(sleep) for _, b := range s.buf { - s.w.Write(b) + if _, err := s.w.Write(b); err != nil { + break + } select { case <-ticker.C: case <-s.exitCh: // skip sleeps finish writes diff --git a/nsqadmin/http.go b/nsqadmin/http.go index b15c7680f..121b4b7d1 100644 --- a/nsqadmin/http.go +++ b/nsqadmin/http.go @@ -139,7 +139,7 @@ func (s *httpServer) indexHandler(w http.ResponseWriter, req *http.Request, ps h }).Parse(string(asset)) w.Header().Set("Content-Type", "text/html") - t.Execute(w, struct { + err := t.Execute(w, struct { Version string ProxyGraphite bool GraphEnabled bool @@ -162,6 +162,9 @@ func (s *httpServer) indexHandler(w http.ResponseWriter, req *http.Request, ps h NSQLookupd: s.nsqadmin.getOpts().NSQLookupdHTTPAddresses, IsAdmin: s.isAuthorizedAdminRequest(req), }) + if err != nil { + return nil, http_api.Err{Code: 500, Text: "INTERNAL_ERROR"} + } return nil, nil } @@ -181,7 +184,7 @@ func (s *httpServer) staticAssetHandler(w http.ResponseWriter, req *http.Request asset, err = staticAsset(assetName) } if err != nil { - return nil, http_api.Err{404, "NOT_FOUND"} + return nil, http_api.Err{Code: 404, Text: "NOT_FOUND"} } ext := path.Ext(assetName) @@ -214,7 +217,7 @@ func (s *httpServer) topicsHandler(w http.ResponseWriter, req *http.Request, ps reqParams, err := http_api.NewReqParams(req) if err != nil { - return nil, http_api.Err{400, err.Error()} + return nil, http_api.Err{Code: 400, Text: err.Error()} } var topics []string @@ -227,7 +230,7 @@ func (s *httpServer) topicsHandler(w http.ResponseWriter, req *http.Request, ps pe, ok := err.(clusterinfo.PartialErr) if !ok { s.nsqadmin.logf(LOG_ERROR, "failed to get topics - %s", err) - return nil, http_api.Err{502, fmt.Sprintf("UPSTREAM_ERROR: %s", err)} + return nil, http_api.Err{Code: 502, Text: fmt.Sprintf("UPSTREAM_ERROR: %s", err)} } s.nsqadmin.logf(LOG_WARN, "%s", err) messages = append(messages, pe.Error()) @@ -273,7 +276,7 @@ func (s *httpServer) topicHandler(w http.ResponseWriter, req *http.Request, ps h pe, ok := err.(clusterinfo.PartialErr) if !ok { s.nsqadmin.logf(LOG_ERROR, "failed to get topic producers - %s", err) - return nil, http_api.Err{502, fmt.Sprintf("UPSTREAM_ERROR: %s", err)} + return nil, http_api.Err{Code: 502, Text: fmt.Sprintf("UPSTREAM_ERROR: %s", err)} } s.nsqadmin.logf(LOG_WARN, "%s", err) messages = append(messages, pe.Error()) @@ -283,7 +286,7 @@ func (s *httpServer) topicHandler(w http.ResponseWriter, req *http.Request, ps h pe, ok := err.(clusterinfo.PartialErr) if !ok { s.nsqadmin.logf(LOG_ERROR, "failed to get topic metadata - %s", err) - return nil, http_api.Err{502, fmt.Sprintf("UPSTREAM_ERROR: %s", err)} + return nil, http_api.Err{Code: 502, Text: fmt.Sprintf("UPSTREAM_ERROR: %s", err)} } s.nsqadmin.logf(LOG_WARN, "%s", err) messages = append(messages, pe.Error()) @@ -313,7 +316,7 @@ func (s *httpServer) channelHandler(w http.ResponseWriter, req *http.Request, ps pe, ok := err.(clusterinfo.PartialErr) if !ok { s.nsqadmin.logf(LOG_ERROR, "failed to get topic producers - %s", err) - return nil, http_api.Err{502, fmt.Sprintf("UPSTREAM_ERROR: %s", err)} + return nil, http_api.Err{Code: 502, Text: fmt.Sprintf("UPSTREAM_ERROR: %s", err)} } s.nsqadmin.logf(LOG_WARN, "%s", err) messages = append(messages, pe.Error()) @@ -323,13 +326,13 @@ func (s *httpServer) channelHandler(w http.ResponseWriter, req *http.Request, ps pe, ok := err.(clusterinfo.PartialErr) if !ok { s.nsqadmin.logf(LOG_ERROR, "failed to get channel metadata - %s", err) - return nil, http_api.Err{502, fmt.Sprintf("UPSTREAM_ERROR: %s", err)} + return nil, http_api.Err{Code: 502, Text: fmt.Sprintf("UPSTREAM_ERROR: %s", err)} } s.nsqadmin.logf(LOG_WARN, "%s", err) messages = append(messages, pe.Error()) } - sort.Sort(clusterinfo.ClientStatsByNodeTopology{channelStats[channelName].Clients}) + sort.Sort(clusterinfo.ClientStatsByNodeTopology{ClientStatsList: channelStats[channelName].Clients}) return struct { *clusterinfo.ChannelStats @@ -345,7 +348,7 @@ func (s *httpServer) nodesHandler(w http.ResponseWriter, req *http.Request, ps h pe, ok := err.(clusterinfo.PartialErr) if !ok { s.nsqadmin.logf(LOG_ERROR, "failed to get nodes - %s", err) - return nil, http_api.Err{502, fmt.Sprintf("UPSTREAM_ERROR: %s", err)} + return nil, http_api.Err{Code: 502, Text: fmt.Sprintf("UPSTREAM_ERROR: %s", err)} } s.nsqadmin.logf(LOG_WARN, "%s", err) messages = append(messages, pe.Error()) @@ -367,7 +370,7 @@ func (s *httpServer) nodeHandler(w http.ResponseWriter, req *http.Request, ps ht pe, ok := err.(clusterinfo.PartialErr) if !ok { s.nsqadmin.logf(LOG_ERROR, "failed to get producers - %s", err) - return nil, http_api.Err{502, fmt.Sprintf("UPSTREAM_ERROR: %s", err)} + return nil, http_api.Err{Code: 502, Text: fmt.Sprintf("UPSTREAM_ERROR: %s", err)} } s.nsqadmin.logf(LOG_WARN, "%s", err) messages = append(messages, pe.Error()) @@ -375,13 +378,13 @@ func (s *httpServer) nodeHandler(w http.ResponseWriter, req *http.Request, ps ht producer := producers.Search(node) if producer == nil { - return nil, http_api.Err{404, "NODE_NOT_FOUND"} + return nil, http_api.Err{Code: 404, Text: "NODE_NOT_FOUND"} } topicStats, _, err := s.ci.GetNSQDStats(clusterinfo.Producers{producer}, "", "", true) if err != nil { s.nsqadmin.logf(LOG_ERROR, "failed to get nsqd stats - %s", err) - return nil, http_api.Err{502, fmt.Sprintf("UPSTREAM_ERROR: %s", err)} + return nil, http_api.Err{Code: 502, Text: fmt.Sprintf("UPSTREAM_ERROR: %s", err)} } var totalClients int64 @@ -412,7 +415,7 @@ func (s *httpServer) tombstoneNodeForTopicHandler(w http.ResponseWriter, req *ht var messages []string if !s.isAuthorizedAdminRequest(req) { - return nil, http_api.Err{403, "FORBIDDEN"} + return nil, http_api.Err{Code: 403, Text: "FORBIDDEN"} } node := ps.ByName("node") @@ -422,11 +425,11 @@ func (s *httpServer) tombstoneNodeForTopicHandler(w http.ResponseWriter, req *ht } err := json.NewDecoder(req.Body).Decode(&body) if err != nil { - return nil, http_api.Err{400, "INVALID_BODY"} + return nil, http_api.Err{Code: 400, Text: "INVALID_BODY"} } if !protocol.IsValidTopicName(body.Topic) { - return nil, http_api.Err{400, "INVALID_TOPIC"} + return nil, http_api.Err{Code: 400, Text: "INVALID_TOPIC"} } err = s.ci.TombstoneNodeForTopic(body.Topic, node, @@ -435,7 +438,7 @@ func (s *httpServer) tombstoneNodeForTopicHandler(w http.ResponseWriter, req *ht pe, ok := err.(clusterinfo.PartialErr) if !ok { s.nsqadmin.logf(LOG_ERROR, "failed to tombstone node for topic - %s", err) - return nil, http_api.Err{502, fmt.Sprintf("UPSTREAM_ERROR: %s", err)} + return nil, http_api.Err{Code: 502, Text: fmt.Sprintf("UPSTREAM_ERROR: %s", err)} } s.nsqadmin.logf(LOG_WARN, "%s", err) messages = append(messages, pe.Error()) @@ -457,20 +460,20 @@ func (s *httpServer) createTopicChannelHandler(w http.ResponseWriter, req *http. } if !s.isAuthorizedAdminRequest(req) { - return nil, http_api.Err{403, "FORBIDDEN"} + return nil, http_api.Err{Code: 403, Text: "FORBIDDEN"} } err := json.NewDecoder(req.Body).Decode(&body) if err != nil { - return nil, http_api.Err{400, err.Error()} + return nil, http_api.Err{Code: 400, Text: err.Error()} } if !protocol.IsValidTopicName(body.Topic) { - return nil, http_api.Err{400, "INVALID_TOPIC"} + return nil, http_api.Err{Code: 400, Text: "INVALID_TOPIC"} } if len(body.Channel) > 0 && !protocol.IsValidChannelName(body.Channel) { - return nil, http_api.Err{400, "INVALID_CHANNEL"} + return nil, http_api.Err{Code: 400, Text: "INVALID_CHANNEL"} } err = s.ci.CreateTopicChannel(body.Topic, body.Channel, @@ -479,7 +482,7 @@ func (s *httpServer) createTopicChannelHandler(w http.ResponseWriter, req *http. pe, ok := err.(clusterinfo.PartialErr) if !ok { s.nsqadmin.logf(LOG_ERROR, "failed to create topic/channel - %s", err) - return nil, http_api.Err{502, fmt.Sprintf("UPSTREAM_ERROR: %s", err)} + return nil, http_api.Err{Code: 502, Text: fmt.Sprintf("UPSTREAM_ERROR: %s", err)} } s.nsqadmin.logf(LOG_WARN, "%s", err) messages = append(messages, pe.Error()) @@ -499,7 +502,7 @@ func (s *httpServer) deleteTopicHandler(w http.ResponseWriter, req *http.Request var messages []string if !s.isAuthorizedAdminRequest(req) { - return nil, http_api.Err{403, "FORBIDDEN"} + return nil, http_api.Err{Code: 403, Text: "FORBIDDEN"} } topicName := ps.ByName("topic") @@ -511,7 +514,7 @@ func (s *httpServer) deleteTopicHandler(w http.ResponseWriter, req *http.Request pe, ok := err.(clusterinfo.PartialErr) if !ok { s.nsqadmin.logf(LOG_ERROR, "failed to delete topic - %s", err) - return nil, http_api.Err{502, fmt.Sprintf("UPSTREAM_ERROR: %s", err)} + return nil, http_api.Err{Code: 502, Text: fmt.Sprintf("UPSTREAM_ERROR: %s", err)} } s.nsqadmin.logf(LOG_WARN, "%s", err) messages = append(messages, pe.Error()) @@ -528,7 +531,7 @@ func (s *httpServer) deleteChannelHandler(w http.ResponseWriter, req *http.Reque var messages []string if !s.isAuthorizedAdminRequest(req) { - return nil, http_api.Err{403, "FORBIDDEN"} + return nil, http_api.Err{Code: 403, Text: "FORBIDDEN"} } topicName := ps.ByName("topic") @@ -541,7 +544,7 @@ func (s *httpServer) deleteChannelHandler(w http.ResponseWriter, req *http.Reque pe, ok := err.(clusterinfo.PartialErr) if !ok { s.nsqadmin.logf(LOG_ERROR, "failed to delete channel - %s", err) - return nil, http_api.Err{502, fmt.Sprintf("UPSTREAM_ERROR: %s", err)} + return nil, http_api.Err{Code: 502, Text: fmt.Sprintf("UPSTREAM_ERROR: %s", err)} } s.nsqadmin.logf(LOG_WARN, "%s", err) messages = append(messages, pe.Error()) @@ -573,12 +576,12 @@ func (s *httpServer) topicChannelAction(req *http.Request, topicName string, cha } if !s.isAuthorizedAdminRequest(req) { - return nil, http_api.Err{403, "FORBIDDEN"} + return nil, http_api.Err{Code: 403, Text: "FORBIDDEN"} } err := json.NewDecoder(req.Body).Decode(&body) if err != nil { - return nil, http_api.Err{400, err.Error()} + return nil, http_api.Err{Code: 400, Text: err.Error()} } switch body.Action { @@ -625,14 +628,14 @@ func (s *httpServer) topicChannelAction(req *http.Request, topicName string, cha s.notifyAdminAction("empty_topic", topicName, "", "", req) } default: - return nil, http_api.Err{400, "INVALID_ACTION"} + return nil, http_api.Err{Code: 400, Text: "INVALID_ACTION"} } if err != nil { pe, ok := err.(clusterinfo.PartialErr) if !ok { s.nsqadmin.logf(LOG_ERROR, "failed to %s topic/channel - %s", body.Action, err) - return nil, http_api.Err{502, fmt.Sprintf("UPSTREAM_ERROR: %s", err)} + return nil, http_api.Err{Code: 502, Text: fmt.Sprintf("UPSTREAM_ERROR: %s", err)} } s.nsqadmin.logf(LOG_WARN, "%s", err) messages = append(messages, pe.Error()) @@ -659,7 +662,7 @@ func (s *httpServer) counterHandler(w http.ResponseWriter, req *http.Request, ps pe, ok := err.(clusterinfo.PartialErr) if !ok { s.nsqadmin.logf(LOG_ERROR, "failed to get counter producer list - %s", err) - return nil, http_api.Err{502, fmt.Sprintf("UPSTREAM_ERROR: %s", err)} + return nil, http_api.Err{Code: 502, Text: fmt.Sprintf("UPSTREAM_ERROR: %s", err)} } s.nsqadmin.logf(LOG_WARN, "%s", err) messages = append(messages, pe.Error()) @@ -669,7 +672,7 @@ func (s *httpServer) counterHandler(w http.ResponseWriter, req *http.Request, ps pe, ok := err.(clusterinfo.PartialErr) if !ok { s.nsqadmin.logf(LOG_ERROR, "failed to get nsqd stats - %s", err) - return nil, http_api.Err{502, fmt.Sprintf("UPSTREAM_ERROR: %s", err)} + return nil, http_api.Err{Code: 502, Text: fmt.Sprintf("UPSTREAM_ERROR: %s", err)} } s.nsqadmin.logf(LOG_WARN, "%s", err) messages = append(messages, pe.Error()) @@ -700,17 +703,17 @@ func (s *httpServer) counterHandler(w http.ResponseWriter, req *http.Request, ps func (s *httpServer) graphiteHandler(w http.ResponseWriter, req *http.Request, ps httprouter.Params) (interface{}, error) { reqParams, err := http_api.NewReqParams(req) if err != nil { - return nil, http_api.Err{400, "INVALID_REQUEST"} + return nil, http_api.Err{Code: 400, Text: "INVALID_REQUEST"} } metric, err := reqParams.Get("metric") if err != nil || metric != "rate" { - return nil, http_api.Err{400, "INVALID_ARG_METRIC"} + return nil, http_api.Err{Code: 400, Text: "INVALID_ARG_METRIC"} } target, err := reqParams.Get("target") if err != nil { - return nil, http_api.Err{400, "INVALID_ARG_TARGET"} + return nil, http_api.Err{Code: 400, Text: "INVALID_ARG_TARGET"} } params := url.Values{} @@ -730,7 +733,7 @@ func (s *httpServer) graphiteHandler(w http.ResponseWriter, req *http.Request, p err = s.client.GETV1(url, &response) if err != nil { s.nsqadmin.logf(LOG_ERROR, "graphite request failed - %s", err) - return nil, http_api.Err{500, "INTERNAL_ERROR"} + return nil, http_api.Err{Code: 500, Text: "INTERNAL_ERROR"} } var rateStr string @@ -755,15 +758,15 @@ func (s *httpServer) doConfig(w http.ResponseWriter, req *http.Request, ps httpr addr, _, err := net.SplitHostPort(req.RemoteAddr) if err != nil { s.nsqadmin.logf(LOG_ERROR, "failed to parse RemoteAddr %s", req.RemoteAddr) - return nil, http_api.Err{400, "INVALID_REMOTE_ADDR"} + return nil, http_api.Err{Code: 400, Text: "INVALID_REMOTE_ADDR"} } ip := net.ParseIP(addr) if ip == nil { s.nsqadmin.logf(LOG_ERROR, "failed to parse RemoteAddr %s", req.RemoteAddr) - return nil, http_api.Err{400, "INVALID_REMOTE_ADDR"} + return nil, http_api.Err{Code: 400, Text: "INVALID_REMOTE_ADDR"} } if !ipnet.Contains(ip) { - return nil, http_api.Err{403, "FORBIDDEN"} + return nil, http_api.Err{Code: 403, Text: "FORBIDDEN"} } } @@ -773,10 +776,10 @@ func (s *httpServer) doConfig(w http.ResponseWriter, req *http.Request, ps httpr readMax := int64(1024*1024 + 1) body, err := io.ReadAll(io.LimitReader(req.Body, readMax)) if err != nil { - return nil, http_api.Err{500, "INTERNAL_ERROR"} + return nil, http_api.Err{Code: 500, Text: "INTERNAL_ERROR"} } if int64(len(body)) == readMax || len(body) == 0 { - return nil, http_api.Err{413, "INVALID_VALUE"} + return nil, http_api.Err{Code: 413, Text: "INVALID_VALUE"} } opts := *s.nsqadmin.getOpts() @@ -784,24 +787,24 @@ func (s *httpServer) doConfig(w http.ResponseWriter, req *http.Request, ps httpr case "nsqlookupd_http_addresses": err := json.Unmarshal(body, &opts.NSQLookupdHTTPAddresses) if err != nil { - return nil, http_api.Err{400, "INVALID_VALUE"} + return nil, http_api.Err{Code: 400, Text: "INVALID_VALUE"} } case "log_level": logLevelStr := string(body) logLevel, err := lg.ParseLogLevel(logLevelStr) if err != nil { - return nil, http_api.Err{400, "INVALID_VALUE"} + return nil, http_api.Err{Code: 400, Text: "INVALID_VALUE"} } opts.LogLevel = logLevel default: - return nil, http_api.Err{400, "INVALID_OPTION"} + return nil, http_api.Err{Code: 400, Text: "INVALID_OPTION"} } s.nsqadmin.swapOpts(&opts) } v, ok := getOptByCfgName(s.nsqadmin.getOpts(), opt) if !ok { - return nil, http_api.Err{400, "INVALID_OPTION"} + return nil, http_api.Err{Code: 400, Text: "INVALID_OPTION"} } return v, nil @@ -833,7 +836,7 @@ func getOptByCfgName(opts interface{}, name string) (interface{}, bool) { continue } if cfgName == "" { - cfgName = strings.Replace(flagName, "-", "_", -1) + cfgName = strings.ReplaceAll(flagName, "-", "_") } if name != cfgName { continue diff --git a/nsqadmin/http_test.go b/nsqadmin/http_test.go index adc843073..246236c71 100644 --- a/nsqadmin/http_test.go +++ b/nsqadmin/http_test.go @@ -134,7 +134,7 @@ func bootstrapNSQClusterWithAuth(t *testing.T, withAuth bool) (string, []*nsqd.N func TestPing(t *testing.T) { dataPath, nsqds, nsqlookupds, nsqadmin1 := bootstrapNSQCluster(t) - defer os.RemoveAll(dataPath) + defer func() { _ = os.RemoveAll(dataPath) }() defer nsqds[0].Exit() defer nsqlookupds[0].Exit() defer nsqadmin1.Exit() @@ -146,14 +146,15 @@ func TestPing(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ := io.ReadAll(resp.Body) - resp.Body.Close() + err = resp.Body.Close() + test.Nil(t, err) test.Equal(t, []byte("OK"), body) } func TestHTTPTopicsGET(t *testing.T) { dataPath, nsqds, nsqlookupds, nsqadmin1 := bootstrapNSQCluster(t) - defer os.RemoveAll(dataPath) + defer func() { _ = os.RemoveAll(dataPath) }() defer nsqds[0].Exit() defer nsqlookupds[0].Exit() defer nsqadmin1.Exit() @@ -169,7 +170,8 @@ func TestHTTPTopicsGET(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ := io.ReadAll(resp.Body) - resp.Body.Close() + err = resp.Body.Close() + test.Nil(t, err) t.Logf("%s", body) tr := TopicsDoc{} @@ -181,7 +183,7 @@ func TestHTTPTopicsGET(t *testing.T) { func TestHTTPTopicGET(t *testing.T) { dataPath, nsqds, nsqlookupds, nsqadmin1 := bootstrapNSQCluster(t) - defer os.RemoveAll(dataPath) + defer func() { _ = os.RemoveAll(dataPath) }() defer nsqds[0].Exit() defer nsqlookupds[0].Exit() defer nsqadmin1.Exit() @@ -197,7 +199,8 @@ func TestHTTPTopicGET(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ := io.ReadAll(resp.Body) - resp.Body.Close() + err = resp.Body.Close() + test.Nil(t, err) t.Logf("%s", body) ts := TopicStatsDoc{} @@ -213,7 +216,7 @@ func TestHTTPTopicGET(t *testing.T) { func TestHTTPNodesGET(t *testing.T) { dataPath, nsqds, nsqlookupds, nsqadmin1 := bootstrapNSQCluster(t) - defer os.RemoveAll(dataPath) + defer func() { _ = os.RemoveAll(dataPath) }() defer nsqds[0].Exit() defer nsqlookupds[0].Exit() defer nsqadmin1.Exit() @@ -227,7 +230,8 @@ func TestHTTPNodesGET(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ := io.ReadAll(resp.Body) - resp.Body.Close() + err = resp.Body.Close() + test.Nil(t, err) hostname, _ := os.Hostname() @@ -247,7 +251,7 @@ func TestHTTPNodesGET(t *testing.T) { func TestHTTPChannelGET(t *testing.T) { dataPath, nsqds, nsqlookupds, nsqadmin1 := bootstrapNSQCluster(t) - defer os.RemoveAll(dataPath) + defer func() { _ = os.RemoveAll(dataPath) }() defer nsqds[0].Exit() defer nsqlookupds[0].Exit() defer nsqadmin1.Exit() @@ -264,7 +268,7 @@ func TestHTTPChannelGET(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ := io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) cs := ChannelStatsDoc{} @@ -286,7 +290,7 @@ func TestHTTPChannelGET(t *testing.T) { func TestHTTPNodesSingleGET(t *testing.T) { dataPath, nsqds, nsqlookupds, nsqadmin1 := bootstrapNSQCluster(t) - defer os.RemoveAll(dataPath) + defer func() { _ = os.RemoveAll(dataPath) }() defer nsqds[0].Exit() defer nsqlookupds[0].Exit() defer nsqadmin1.Exit() @@ -304,7 +308,7 @@ func TestHTTPNodesSingleGET(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ := io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) ns := NodeStatsDoc{} @@ -323,7 +327,7 @@ func TestHTTPNodesSingleGET(t *testing.T) { func TestHTTPCreateTopicPOST(t *testing.T) { dataPath, nsqds, nsqlookupds, nsqadmin1 := bootstrapNSQCluster(t) - defer os.RemoveAll(dataPath) + defer func() { _ = os.RemoveAll(dataPath) }() defer nsqds[0].Exit() defer nsqlookupds[0].Exit() defer nsqadmin1.Exit() @@ -341,12 +345,12 @@ func TestHTTPCreateTopicPOST(t *testing.T) { resp, err := client.Do(req) test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) - resp.Body.Close() + _ = resp.Body.Close() } func TestHTTPCreateTopicChannelPOST(t *testing.T) { dataPath, nsqds, nsqlookupds, nsqadmin1 := bootstrapNSQCluster(t) - defer os.RemoveAll(dataPath) + defer func() { _ = os.RemoveAll(dataPath) }() defer nsqds[0].Exit() defer nsqlookupds[0].Exit() defer nsqadmin1.Exit() @@ -365,12 +369,12 @@ func TestHTTPCreateTopicChannelPOST(t *testing.T) { resp, err := client.Do(req) test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) - resp.Body.Close() + _ = resp.Body.Close() } func TestHTTPTombstoneTopicNodePOST(t *testing.T) { dataPath, nsqds, nsqlookupds, nsqadmin1 := bootstrapNSQCluster(t) - defer os.RemoveAll(dataPath) + defer func() { _ = os.RemoveAll(dataPath) }() defer nsqds[0].Exit() defer nsqlookupds[0].Exit() defer nsqadmin1.Exit() @@ -388,12 +392,12 @@ func TestHTTPTombstoneTopicNodePOST(t *testing.T) { resp, err := client.Do(req) test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) - resp.Body.Close() + _ = resp.Body.Close() } func TestHTTPDeleteTopicPOST(t *testing.T) { dataPath, nsqds, nsqlookupds, nsqadmin1 := bootstrapNSQCluster(t) - defer os.RemoveAll(dataPath) + defer func() { _ = os.RemoveAll(dataPath) }() defer nsqds[0].Exit() defer nsqlookupds[0].Exit() defer nsqadmin1.Exit() @@ -408,12 +412,12 @@ func TestHTTPDeleteTopicPOST(t *testing.T) { resp, err := client.Do(req) test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) - resp.Body.Close() + _ = resp.Body.Close() } func TestHTTPDeleteChannelPOST(t *testing.T) { dataPath, nsqds, nsqlookupds, nsqadmin1 := bootstrapNSQCluster(t) - defer os.RemoveAll(dataPath) + defer func() { _ = os.RemoveAll(dataPath) }() defer nsqds[0].Exit() defer nsqlookupds[0].Exit() defer nsqadmin1.Exit() @@ -429,12 +433,12 @@ func TestHTTPDeleteChannelPOST(t *testing.T) { resp, err := client.Do(req) test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) - resp.Body.Close() + _ = resp.Body.Close() } func TestHTTPPauseTopicPOST(t *testing.T) { dataPath, nsqds, nsqlookupds, nsqadmin1 := bootstrapNSQCluster(t) - defer os.RemoveAll(dataPath) + defer func() { _ = os.RemoveAll(dataPath) }() defer nsqds[0].Exit() defer nsqlookupds[0].Exit() defer nsqadmin1.Exit() @@ -453,7 +457,7 @@ func TestHTTPPauseTopicPOST(t *testing.T) { test.Nil(t, err) _, _ = io.ReadAll(resp.Body) test.Equal(t, 200, resp.StatusCode) - resp.Body.Close() + _ = resp.Body.Close() url = fmt.Sprintf("http://%s/api/topics/%s", nsqadmin1.RealHTTPAddr(), topicName) body, _ = json.Marshal(map[string]interface{}{ @@ -463,12 +467,12 @@ func TestHTTPPauseTopicPOST(t *testing.T) { resp, err = client.Do(req) test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) - resp.Body.Close() + _ = resp.Body.Close() } func TestHTTPPauseChannelPOST(t *testing.T) { dataPath, nsqds, nsqlookupds, nsqadmin1 := bootstrapNSQCluster(t) - defer os.RemoveAll(dataPath) + defer func() { _ = os.RemoveAll(dataPath) }() defer nsqds[0].Exit() defer nsqlookupds[0].Exit() defer nsqadmin1.Exit() @@ -488,7 +492,7 @@ func TestHTTPPauseChannelPOST(t *testing.T) { test.Nil(t, err) _, _ = io.ReadAll(resp.Body) test.Equal(t, 200, resp.StatusCode) - resp.Body.Close() + _ = resp.Body.Close() url = fmt.Sprintf("http://%s/api/topics/%s/ch", nsqadmin1.RealHTTPAddr(), topicName) body, _ = json.Marshal(map[string]interface{}{ @@ -498,19 +502,20 @@ func TestHTTPPauseChannelPOST(t *testing.T) { resp, err = client.Do(req) test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) - resp.Body.Close() + _ = resp.Body.Close() } func TestHTTPEmptyTopicPOST(t *testing.T) { dataPath, nsqds, nsqlookupds, nsqadmin1 := bootstrapNSQCluster(t) - defer os.RemoveAll(dataPath) + defer func() { _ = os.RemoveAll(dataPath) }() defer nsqds[0].Exit() defer nsqlookupds[0].Exit() defer nsqadmin1.Exit() topicName := "test_empty_topic_post" + strconv.Itoa(int(time.Now().Unix())) topic := nsqds[0].GetTopic(topicName) - topic.PutMessage(nsqd.NewMessage(nsqd.MessageID{}, []byte("1234"))) + err := topic.PutMessage(nsqd.NewMessage(nsqd.MessageID{}, []byte("1234"))) + test.Nil(t, err) test.Equal(t, int64(1), topic.Depth()) time.Sleep(100 * time.Millisecond) @@ -524,14 +529,14 @@ func TestHTTPEmptyTopicPOST(t *testing.T) { test.Nil(t, err) _, _ = io.ReadAll(resp.Body) test.Equal(t, 200, resp.StatusCode) - resp.Body.Close() + _ = resp.Body.Close() test.Equal(t, int64(0), topic.Depth()) } func TestHTTPEmptyChannelPOST(t *testing.T) { dataPath, nsqds, nsqlookupds, nsqadmin1 := bootstrapNSQCluster(t) - defer os.RemoveAll(dataPath) + defer func() { _ = os.RemoveAll(dataPath) }() defer nsqds[0].Exit() defer nsqlookupds[0].Exit() defer nsqadmin1.Exit() @@ -539,7 +544,8 @@ func TestHTTPEmptyChannelPOST(t *testing.T) { topicName := "test_empty_channel_post" + strconv.Itoa(int(time.Now().Unix())) topic := nsqds[0].GetTopic(topicName) channel := topic.GetChannel("ch") - channel.PutMessage(nsqd.NewMessage(nsqd.MessageID{}, []byte("1234"))) + err := channel.PutMessage(nsqd.NewMessage(nsqd.MessageID{}, []byte("1234"))) + test.Nil(t, err) time.Sleep(100 * time.Millisecond) test.Equal(t, int64(1), channel.Depth()) @@ -554,14 +560,14 @@ func TestHTTPEmptyChannelPOST(t *testing.T) { test.Nil(t, err) _, _ = io.ReadAll(resp.Body) test.Equal(t, 200, resp.StatusCode) - resp.Body.Close() + _ = resp.Body.Close() test.Equal(t, int64(0), channel.Depth()) } func TestHTTPconfig(t *testing.T) { dataPath, nsqds, nsqlookupds, nsqadmin1 := bootstrapNSQCluster(t) - defer os.RemoveAll(dataPath) + defer func() { _ = os.RemoveAll(dataPath) }() defer nsqds[0].Exit() defer nsqlookupds[0].Exit() defer nsqadmin1.Exit() @@ -579,7 +585,7 @@ func TestHTTPconfig(t *testing.T) { url := fmt.Sprintf("http://%s/config/nsqlookupd_http_addresses", nsqadmin1.RealHTTPAddr()) resp, err := http.Get(url) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() body, _ := io.ReadAll(resp.Body) test.Equal(t, 200, resp.StatusCode) origaddrs := fmt.Sprintf(`["%s"]`, nsqlookupds[0].RealHTTPAddr().String()) @@ -592,7 +598,7 @@ func TestHTTPconfig(t *testing.T) { test.Nil(t, err) resp, err = client.Do(req) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() body, _ = io.ReadAll(resp.Body) test.Equal(t, 200, resp.StatusCode) test.Equal(t, addrs, string(body)) @@ -602,7 +608,7 @@ func TestHTTPconfig(t *testing.T) { test.Nil(t, err) resp, err = client.Do(req) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() _, _ = io.ReadAll(resp.Body) test.Equal(t, 200, resp.StatusCode) test.Equal(t, LOG_FATAL, nsqadmin1.getOpts().LogLevel) @@ -612,7 +618,7 @@ func TestHTTPconfig(t *testing.T) { test.Nil(t, err) resp, err = client.Do(req) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() _, _ = io.ReadAll(resp.Body) test.Equal(t, 400, resp.StatusCode) } @@ -638,7 +644,7 @@ func TestHTTPconfigCIDR(t *testing.T) { url := fmt.Sprintf("http://%s/config/nsqlookupd_http_addresses", nsqadmin.RealHTTPAddr()) resp, err := http.Get(url) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() _, _ = io.ReadAll(resp.Body) test.Equal(t, 403, resp.StatusCode) } diff --git a/nsqadmin/nsqadmin.go b/nsqadmin/nsqadmin.go index c3ef803e4..bb9e2b556 100644 --- a/nsqadmin/nsqadmin.go +++ b/nsqadmin/nsqadmin.go @@ -161,7 +161,9 @@ func (n *NSQAdmin) handleAdminActions() { if err != nil { n.logf(LOG_ERROR, "failed to POST notification - %s", err) } - resp.Body.Close() + if err := resp.Body.Close(); err != nil { + n.logf(LOG_ERROR, "failed to close notification response body - %s", err) + } } } @@ -189,7 +191,9 @@ func (n *NSQAdmin) Main() error { func (n *NSQAdmin) Exit() { if n.httpListener != nil { - n.httpListener.Close() + if err := n.httpListener.Close(); err != nil { + n.logf(LOG_ERROR, "failed to close HTTP listener - %s", err) + } } close(n.notifications) n.waitGroup.Wait() diff --git a/nsqadmin/nsqadmin_test.go b/nsqadmin/nsqadmin_test.go index e2fbc7c21..c7106f484 100644 --- a/nsqadmin/nsqadmin_test.go +++ b/nsqadmin/nsqadmin_test.go @@ -43,7 +43,7 @@ func TestTLSHTTPClient(t *testing.T) { nsqdOpts.TLSClientAuthPolicy = "require-verify" nsqdOpts.Logger = lgr _, nsqdHTTPAddr, nsqd := mustStartNSQD(nsqdOpts) - defer os.RemoveAll(nsqdOpts.DataPath) + defer func() { _ = os.RemoveAll(nsqdOpts.DataPath) }() defer nsqd.Exit() opts := NewOptions() @@ -72,7 +72,7 @@ func TestTLSHTTPClient(t *testing.T) { resp, err := http.Get(u.String()) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() test.Equal(t, resp.StatusCode < 500, true) } diff --git a/nsqadmin/test/ca.key b/nsqadmin/test/ca.key index 37b6d4ffa..8d78742a9 100644 --- a/nsqadmin/test/ca.key +++ b/nsqadmin/test/ca.key @@ -1,12 +1,30 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,D6208487450BDF1C - -tucU/4j6agGQlW60D8V3Zr/QHcLhhyFagres1gGdWfGIqluNZb7omki/XidHXJSG -eB9vV2Xb12/8umc31e7Mnmn9hd34230v/KlAnJ4ukDpJpbmjnEx3F9uiqYFi/yxQ -avSsfF6Tsh3XOh3Oe27I/xfYx37g6Agd+EQEJ1hvWvygMIJMTDMP5ZaFoZANtFLy -hDEZ6woJSn9avF/L+1GW8jl2aI1QbdKkK0jDHgFAwUI4sjWeXvEQNNYY3trTIoMo -wab3vi+4XziFONbS4OZrZUYfZPB5YOFbtT2whzggp2HdSTiu48/Ld3N8SjuMrKfm -uR+nd+ovQ5kVWHInzWAIXSyPhgR9ZY8eyXaHNJJfzNu3HY72lfzD/NtZfacMRBr6 -M3Wg/OKPS7ZrtqCWkY9P3KK9Cul8Jzy229fSqHo8Rg4= ------END RSA PRIVATE KEY----- +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFNTBfBgkqhkiG9w0BBQ0wUjAxBgkqhkiG9w0BBQwwJAQQvUfvUZrAIMXiPRHb +fRu+ngICCAAwDAYIKoZIhvcNAgkFADAdBglghkgBZQMEASoEECnIcBk1sDUld+fL +xs08odgEggTQUtFd4tYC0sTnZJGEgbFatr6ivDL3Wggth65SxsL1jnkqrm+Jk/vp +sUJBZUyNzu7TtwUSM8NiPfkpeOA+pq/vdYIGQ5auPTm012q2L989vFJfIhCiAysu +12XJ8Ofjj8d8fS7xDsDrLNFCYFi+pgqLQ/0vTPoO0LaOHp5jv65pmofdDYkJAort +EGVUE5DCkV2cyHCQOTX1KS+g/13ODErnBSmTRN5XLQQQoUTas150zxaplHHHAH2H +vx5LjNZFC/1NlXaveMc7MMNJNhf/QCI7cdle39S8ZJAZz/IevOvS+wE2bbbxEM1m +EwXFjhYeein0pD0JXzRjluqqwAfVDQMy9PC9Zlmn0brl7OobElOwNQRuMG2NHoJa +cSJdm+0v6a7YeAa2yHakBhvdNHJZZaBFEUPAYun+NTUgbueDmAlPyW1G78Dcy9yL +2p4weKKJYuyneU1sXXXQddRaz9U/6LJCsCoO4EsdT4vvKN//0LDSVPZR94QKKaLv +OQDwadGy/J3uzb0dyOGZAoQli43bddbq5YamU4YTAXQcgsp2ghCfQThDrYERml1K +AEvK6GRzOBA1vCFYc7Gpikt6oY2LHLpGemR6FUxuQx2sOYHfFDJnoQ0ZiH0g9RBu +1J4q720fqhviS4lRpoW0byzd1ir2jP9YP/VArLNA24xGElW6ecdsAEJOxDJ+ozg7 +l6bbwuIN/4BrZ3ixwx82NWIGUqjs3ZOPG84jXs9Hipg4dl1xA6jmaE2Ig03BKTLJ +a+njGvlIp31qtYrI6QCrAvoqllgO0yBJeOa+441ktpfODsJmi0icUJK0IgNXmTHj +D/RNV6EBJFNS8UWIU8x/cXDhkSVLFt+7sKa6GvuQbMGqN/O7qRP5InNMZY8Q4XGx +v5m75oxYDgt9vQiTecpESGtEl5sIZpI+wwKXJbA37IHkP9nyU6ezfs+YV4ipO4K9 +OZO3zz98MrBDTArTxFUmkoFRDzeGA1zsBVxl43O75yklxBdaEV2SGIXgdji99kKF +Gy8viEpny5b3Z1fU6tCUSIAtXjps7dv+Y9Aa9MfJxBKhQfajU/kU+aDAvK5jNE5p +ERJXgrj8wjeSJOkJkPZoP4eXWnKsoRKNF2aIVYYKkuWYOCIIc/z8+yWpdo0ta6XA +6EtzMzYT2WF/TmfzvraRPGEtMjDOInh9S3b5JmXCB5pEQHdWOXhBi+CGtRfSZKmR +HXhU6EtkmxQhfq2R9DNPuprN4t+T/u+KFZLGOML1USWcKHQOE5lY5qW1WbMeHsuo +UegHyoLL9bAS5FTQUB7XILyVB1zL3dsJCinVpYmpiMVir/fSFNnFWGqCTDoAoNF2 +62CAweZ+pcGKC9okCadIzXzr+5gu/ToLRooK4g823AABWHMGrApU523ktgXDewgX +6Ic13ciua9KIEJnB0AsivxDH1GaLuETUNSz6CjPgqxzZ8mOaxoa4LzbbuZ6sxm15 +FaUBi7INAVwHASKl1YKDxWETtYbwgMUPt81Um4NCsRNkf/93/3xApz3InU6tD7Iw +NCrrN4ZprPO4Xu97nXbNtAgvFjjaaWvutbnP8AIRX7xxPJoLxPyLApY52m50K/cA +iCe5BbY/RitNaMxcJ2cZUA467EPR4qrIhFYsE4j58RYFf8fOzV8u0y4= +-----END ENCRYPTED PRIVATE KEY----- diff --git a/nsqadmin/test/ca.pem b/nsqadmin/test/ca.pem index 08150a568..0b77d96f8 100644 --- a/nsqadmin/test/ca.pem +++ b/nsqadmin/test/ca.pem @@ -1,10 +1,18 @@ -----BEGIN CERTIFICATE----- -MIIBVDCB/6ADAgECAgkAvHG4Z/7nX/gwDQYJKoZIhvcNAQEFBQAwDTELMAkGA1UE -AwwCY2EwHhcNMTcwOTE2MTc0NDE0WhcNMjcwOTE0MTc0NDE0WjANMQswCQYDVQQD -DAJjYTBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDJAM3Tr1BoxlLJtTy0oRcp93dT -9hhHwms8P1V3k2FpXYRS4deUo+uwcAM9KGDt9VMXVBEchtI4VYTvLgatBPUBAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMyLx7rjKBe/xZQLnVzI -uqNNVzxRMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAANBAJiN1XgPPlQ2 -z7PhtzXStaz/BJVqhD7g9fsZsmoPX4ifDsTfzUsRB56Aq/NTsKiIYQkFPHH0donG -++a5ZVWjgYk= +MIIC6jCCAdKgAwIBAgIUU7yNoVgv+VAA3jIq+NtNd2uj4JwwDQYJKoZIhvcNAQEL +BQAwDTELMAkGA1UEAwwCY2EwHhcNMjYwNzE2MDQwOTAwWhcNMzYwNzEzMDQwOTAw +WjANMQswCQYDVQQDDAJjYTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AMjUBsJDsK0heNoAsupsFKB4qvABNjgrR+TjbMaRxq/wWDP0buUKC209c1iIPCAq +8rCt3w6NHOEsClQXjLgK+09M2vkLJXDQDxCY+d7TjTwnBMUyq8s3VUdYHv8T2sjP +Dnvtatc4fdZkk/Yoemf01eENtU8SkLAlk01ckqMJdvuJZSCiteiwkDB7iHcJRshH +6b6R2eNJD3sIJdQHqFMtZ8dYXgSPDwBjq9RL1dbidmIpW4+RZxgERcWFER0AS3WM +BK3M9zWV2J8xaN9a6Sy+oYMbkFFy49aQGuD5+vyNyh9wZigCVuGV6syMltGOpi18 ++qnqXjM3yp1OTqaRNE2mbJkCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUSIex/4DUEkgoHbjeLziS8MXbxbwwDgYDVR0PAQH/BAQDAgEGMA0GCSqG +SIb3DQEBCwUAA4IBAQBHPt/3jHoZJ3BA/h1sZT0fNY84VUrRp/KCtMl010siQE/K +2zaM0PsAe4kNDsfaRvsJh64faC1lxcsRDypvxzU894CXrPfyeqgNTvcuZFCaCnqb +eyWQloBzZ9oJFtPFoMTkRmsP7o5hfvpZswpQTF1KTfKeh80Z2K8XZIELlmfM6TWC +iAm5es/fvUhERX9nEWEvCp5lAVv7JZ1ho07XaS+cU0Y7vgD+dTbloOxhN9QGnkLn +5yCUUDLWvygiG2utf5B6mnB9o+WvGLYzqvZKsui/ZUoLyKBz9f5zrJmDp6n2mlGH +AWdQV1aM0yZBuxMfHVhB+KTv99T23vIi25pDO5pX -----END CERTIFICATE----- diff --git a/nsqadmin/test/ca.srl b/nsqadmin/test/ca.srl index 383e68ea0..40655e03e 100644 --- a/nsqadmin/test/ca.srl +++ b/nsqadmin/test/ca.srl @@ -1 +1 @@ -91418D04995922E7 +28984F6B710840EA4D023FB6A19FE98B0FAE6E18 diff --git a/nsqadmin/test/client.key b/nsqadmin/test/client.key index 7993aa121..d801efc7c 100644 --- a/nsqadmin/test/client.key +++ b/nsqadmin/test/client.key @@ -1,27 +1,28 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEAuMz5IJ01Wqaj2qJAU7o2aoc2iP1BRhTba+cWrsjbZA+6kXAk -19Dlz/nNK8gxsBMl3rzTGWXKUm/rKBDp680zJkj8nzcGApGlzbDoqXym8ixOniOC -aH/RODPC8OtD2UozeXlUOQWK+ufkMvmVBc/IeJyFkcm7jhX+LHVFn+3iWLRNbzGm -hbf8oNHvybS7HSuV3OYiHDJxA0d6IgozqVOYVSqdDabQ2FN/8nKzpMHjwMpfT008 -5hUhr72E5XuJ3biPUwoOrRETSa1/EQcAEH0wSwHU1AGdnGh3/5ynVupfef0qkyqw -NseYs9U++IUFXqA1IuEmAlJn5QczAHjPQe8xBQIDAQABAoIBAGx4CyZEgCOUOgrD -P2SloPkIIk9n7x82cNA11I+E35kszkI9g7KVL77SDcZL/DYwFwNU68c1gvq+LFXZ -D6RTTlmDb5v4TPPHD33a/8UzoD33GbIif5HcrC4D28FTJgDtV6dOOsw5X6kD4WK2 -Me02V6HLpW677PVqHUV1FAfaNgf/1SIhJCechYSO+3pKPtli8DnsmOd336wNtWZR -Q3Ctm63Eq7AiLmGLOkLYtll9Kr6WfCSFHBmqJg9MsQEfINXMCOB54Z+xkoijjJLO -zNSk/3XvppB1JpmAusbo9Mq03Ci9JdinYSKxwVOG6e+5cosrOHpDQyZIWa87ZTpk -kjLCgEECgYEA33JCGTEwaqfAuYOspCZvi2Mqz7t6QiwvwxgDf4JFLgDQArJfzKlC -bAzaSU8bT+SN96CF9LU4XekN5/paGZAFjWxraPkK0oL28kQrtzfEQv2XL6GFoNAh -WsQtoaGddL9VPWlCiHeueYERIDNrZCaVeAx6OV6W3CEwGOkRiQyntlUCgYEA07lf -LpxF8aAgMToq3++D5RGAXaT2PYxhZZFb5Y2tS7a4T0ulQwXQi4H2dObGJ32zCjFG -ls1H91mNKGBbyKnF1jT/dt/acqymvipASm1xq6uysIllA4xp56sDnJgG9bnXjYFY -m2yVNIoIQGZ7jp7e6t1KQ9San6V8asWlvBLXX/ECgYEAuhF9dVj+xnH3DQTXSMIw -9NOZnO6zelMtWrqufwnN7ecDUJuVJupzw2JYi99yEO90QRbNNd+KlrkxuVFCojLK -TOBR+VIZbv9cAJZACQxJRLfDpAhPLIDkpZ7jmMrqQYPqyX7TxqxTAB84UaY/8WAn -65YIWamo2ppQYQ4Eaim9pxkCgYAMwfW/TEFWruxhqvycY8VRzz0p51/DE6tmwFyG -N4RCtK7kcE1z/Wy0i087ehBknslkCtYTDimQ+P9teGjvbXNzVdwy4Ig8MrUVblxT -X8birkTlKFJC5XoYMJDWJb79nYYki6+4JdHTyaF3p/U4AdCy3ES2U6BBkGov0NsM -uyHpMQKBgGc9wIGHwAGLg3iVHGXbXELdpzVztLRC7D12TPfdtGBLTD5NH5jAx8K/ -w61+l4tzFcK3jfWzwdme277cBgfq/aw2DDt07vkOvPzhUwVZiE39bfddfIvyed99 -XzEMf8THh5wdm6mLsOVgdfOfFcDi5ReIv1/7+eOd/MQi8TxIVfAu ------END RSA PRIVATE KEY----- +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCrp/fU9Eu4HFIi +uH7JGgMjByv1l/887VUJOHXuf9s2pdfNBXI0Gy9zwmamdxun1KLDbdP5ujbjQOKa +KnOZLczaZRyol0dduw6nvh7PJAnUFlDIBC88rIWBBUfrcVU/zXXfkda9FCEZNRts +b+f3IskzHNW3K/OoyYmLS5JkluDtq8WGQ2vWdG8A7DaM19LivLqx+3oTZ/S68fso +2xwYp5ikbbOEfot824g2RJzqblr6CoxCttX0COo4C7G1EadW9MsZ3Xqbh7Xuo91R +2TOYUoOrK0eB6sPn5yr6wd8LUIS14Fuxdsnps6Xwjyz1Uq2LXrlUbbc4TJgIlB0l +mJIN/D1FAgMBAAECggEADP/o9bsp2tUQ5qk94iFIAzNBVyro0lE6Qzr/5LfRFFKQ +mmm4VuLc1Ubv0C6CrSieH5pl1xU3n+k43/+pW9HgoC96cU1s7a0YtIe3keytmTQM +GmxatB0an9qUXOvAeYGn/25DgB6R98nnpu7TTIous4y8+09m91g1RD53uooZ7wBs +W3oyxOpxfaRFbEi+fzBadZ/aem/5NP1ArcVSZc/Ke2B15aqYwlTesS/CWxp4kmYz +XeKbKbkXrfvhleJ3Q5MRjz/Y5E8fYMvO/vHaZI/R8G50LNRrbmsEu3tgmb7ETOir +TrsatKBaJdy9JH3jRq/LYHJ9DB9rdl1bw2ZWXiCedwKBgQDt+ejqWSWfY82Fi4dJ +Jjuk66d3F4Y1walag7D5wG0vsRQqry3i9Az9HBI2e3Yfa/v6cIO+V0DnFnKJYgQI +jr3ZLZWk7lzvLy9Hjsena4ejDdxtf7P8K5pS+0yL04us09nBQbON4AgJwVJ6GmAQ +cQ6AHPQd2RlU8jn0ggFbO6lOIwKBgQC4qC/I7jJlLsSp8cWVk9C77G38R9ySa0/Z +QMOebjnT0wDjh7RoxJ/T8F43Eq0dU7+3RbbeNEItAp8RhV3nyGmSizY/SXZXB6P7 +BIFqa5a2elVuX1Y0ahEs1pwifoa65P5DDoEp8nTV0GeR6NjRh60tCjqnlcPT5o4t +3G9qPXKZdwKBgQDfKTjK8lg+lOe48PQnm4vZBweevVek93upns8KFfIOBB+mO2pr +ZnL7tCQ8JSDLLIc5/eL9TnNVgQ5dWKXxpHHRxFaNON27imLq1rDRhhvGwwvPPy74 +LadlY7UPdoyHwI52FPec9tZy13BRgoRNRsfTSdN+XgTMTO4eJP/CnzsQQwKBgFqe +nyS6UJz7QKQt9EsdiVhQBQHDumlYpIz3jYiYi2R6rnr6w/yOUelOks3wKmi0CufE +HKQbfUZdfPa6PoVbAwRZsTuJr7uyEjVD1scFGadfjcFmpAWA8ADTKTh8Y14gtu7t +lVGinNe5OLqQTKc3MDNkS7imdL3u7WNwRHUcxrqtAoGBAKHnNdm3oD5pF6JDXHkg +7mC1yIwxWF6eEId5FVvP/x2BwBRt/ZQ8fvTPqhtoQOSbdJsXRsbsQ8Vycg2w2BWH +eAY/CNDRQ5HS7xWG4sFI/LoNg6ShFGfj3M6DUQRbVjfYt4EPrzuQFlbs0z+cn38U +0mhtwNmJi/XYPh/1dhIe7Eyg +-----END PRIVATE KEY----- diff --git a/nsqadmin/test/client.pem b/nsqadmin/test/client.pem index a6480ddc8..2d20e4f0c 100644 --- a/nsqadmin/test/client.pem +++ b/nsqadmin/test/client.pem @@ -1,17 +1,22 @@ -----BEGIN CERTIFICATE----- -MIICyzCCAnWgAwIBAgIJAJFBjQSZWSLnMA0GCSqGSIb3DQEBCwUAMA0xCzAJBgNV -BAMMAmNhMB4XDTE3MDkxNjE3NDQxNFoXDTI3MDkxNDE3NDQxNFowgYcxIzAhBgkq -hkiG9w0BCQEWFG1yZWlmZXJzb25AZ21haWwuY29tMQswCQYDVQQGEwJERTEMMAoG -A1UECBMDTlJXMQ4wDAYDVQQHEwVFYXJ0aDEXMBUGA1UEChMOUmFuZG9tIENvbXBh -bnkxCzAJBgNVBAsTAklUMQ8wDQYDVQQDEwZuc3EuaW8wggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQC4zPkgnTVapqPaokBTujZqhzaI/UFGFNtr5xauyNtk -D7qRcCTX0OXP+c0ryDGwEyXevNMZZcpSb+soEOnrzTMmSPyfNwYCkaXNsOipfKby -LE6eI4Jof9E4M8Lw60PZSjN5eVQ5BYr65+Qy+ZUFz8h4nIWRybuOFf4sdUWf7eJY -tE1vMaaFt/yg0e/JtLsdK5Xc5iIcMnEDR3oiCjOpU5hVKp0NptDYU3/ycrOkwePA -yl9PTTzmFSGvvYTle4nduI9TCg6tERNJrX8RBwAQfTBLAdTUAZ2caHf/nKdW6l95 -/SqTKrA2x5iz1T74hQVeoDUi4SYCUmflBzMAeM9B7zEFAgMBAAGjdTBzMAwGA1Ud -EwEB/wQCMAAwHQYDVR0OBBYEFMzYXiTD7moi0oXqSQ5D2LsO51GXMB8GA1UdIwQY -MBaAFMyLx7rjKBe/xZQLnVzIuqNNVzxRMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUE -DDAKBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAANBAAujxas6toRhMl/+kZrly0G/ -AvjbA3WY5cLLIdffGdQ5bsS3aOP23nj98ut7unNUNsCo+eUwpJgvabnFnL+NFZA= +MIIDmDCCAoCgAwIBAgIUKJhPa3EIQOpNAj+2oZ/piw+ubhgwDQYJKoZIhvcNAQEL +BQAwDTELMAkGA1UEAwwCY2EwHhcNMjYwNzE2MDQwOTAwWhcNMzYwNzEzMDQwOTAw +WjCBhzEjMCEGCSqGSIb3DQEJARYUbXJlaWZlcnNvbkBnbWFpbC5jb20xCzAJBgNV +BAYTAkRFMQwwCgYDVQQIDANOUlcxDjAMBgNVBAcMBUVhcnRoMRcwFQYDVQQKDA5S +YW5kb20gQ29tcGFueTELMAkGA1UECwwCSVQxDzANBgNVBAMMBm5zcS5pbzCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKun99T0S7gcUiK4fskaAyMHK/WX +/zztVQk4de5/2zal180FcjQbL3PCZqZ3G6fUosNt0/m6NuNA4poqc5ktzNplHKiX +R127Dqe+Hs8kCdQWUMgELzyshYEFR+txVT/Ndd+R1r0UIRk1G2xv5/ciyTMc1bcr +86jJiYtLkmSW4O2rxYZDa9Z0bwDsNozX0uK8urH7ehNn9Lrx+yjbHBinmKRts4R+ +i3zbiDZEnOpuWvoKjEK21fQI6jgLsbURp1b0yxndepuHte6j3VHZM5hSg6srR4Hq +w+fnKvrB3wtQhLXgW7F2yemzpfCPLPVSrYteuVRttzhMmAiUHSWYkg38PUUCAwEA +AaN1MHMwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUo6AgTMKXqu/gMFKDJN5cG2/+ +Wc0wHwYDVR0jBBgwFoAUSIex/4DUEkgoHbjeLziS8MXbxbwwDgYDVR0PAQH/BAQD +AgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4IBAQCMrSDV +OAY3BeD9os+DK2DGty9d76Tj+afSTIb9GeZO6wmfqg9bIEs9FEA9mMI8tBvM4MpO +gp69t4Js0GryVhaaEZviv/RYzfRcpTENhHNojMXsV22hU6GojACbAguHTNyUJw2Z +XH+hFF+YmVVgW3a87tmCeCVblGJn7rWarX8COL10f8UAbEEEe25Hg8tDbtuv8QJj +9EbKTe9KTWG11zGSUEVVuIo4AnAvdhRmmwNblQRQ3da0pJgyWCP9Bl/ITC8zL+mM +8W3su1snmZ2p5GbdE6RQfbNnU6+GfMGudPKkUEoHtGY+bsTM7b22VgsJl0iI+OGU +974gsM93BQcad8Cq -----END CERTIFICATE----- diff --git a/nsqadmin/test/client.req b/nsqadmin/test/client.req index 1ceb750f9..dae584bd3 100644 --- a/nsqadmin/test/client.req +++ b/nsqadmin/test/client.req @@ -1,18 +1,18 @@ -----BEGIN CERTIFICATE REQUEST----- MIICzTCCAbUCAQAwgYcxIzAhBgkqhkiG9w0BCQEWFG1yZWlmZXJzb25AZ21haWwu -Y29tMQswCQYDVQQGEwJERTEMMAoGA1UECBMDTlJXMQ4wDAYDVQQHEwVFYXJ0aDEX -MBUGA1UEChMOUmFuZG9tIENvbXBhbnkxCzAJBgNVBAsTAklUMQ8wDQYDVQQDEwZu -c3EuaW8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4zPkgnTVapqPa -okBTujZqhzaI/UFGFNtr5xauyNtkD7qRcCTX0OXP+c0ryDGwEyXevNMZZcpSb+so -EOnrzTMmSPyfNwYCkaXNsOipfKbyLE6eI4Jof9E4M8Lw60PZSjN5eVQ5BYr65+Qy -+ZUFz8h4nIWRybuOFf4sdUWf7eJYtE1vMaaFt/yg0e/JtLsdK5Xc5iIcMnEDR3oi -CjOpU5hVKp0NptDYU3/ycrOkwePAyl9PTTzmFSGvvYTle4nduI9TCg6tERNJrX8R -BwAQfTBLAdTUAZ2caHf/nKdW6l95/SqTKrA2x5iz1T74hQVeoDUi4SYCUmflBzMA -eM9B7zEFAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEALD1VjbBjaeX7l7JR4IuL -wrHVrFDiRYsgvqyw39j2MC95VwrGwzf4cXCE+RuqE/DhbV9UI7sWKaJfFs9Usq+g -VSoKnHSEylt34y6ABSc5eAik+GnheJZbJ6UDjxcvNd0UpFGMrHbsXVyQd0Y1XAu7 -nxCYIa82kNA+Opb+ra03hkLC7wvRLbXTOB2g6JLkyhYR6S5GkOFTNnz2AJerN7zt -NEL7owlRcjyIsL5tjDpDH1944NNtzhgmrUeIjB08reayuot9RKznMVGwBfY6DIHM -Q4uNN3CMOOoAHr1UzvBf/qfvb6ltPTMKSV1OncLlC3C59NoO8vhKIHCN18Ya2OMu -rw== +Y29tMQswCQYDVQQGEwJERTEMMAoGA1UECAwDTlJXMQ4wDAYDVQQHDAVFYXJ0aDEX +MBUGA1UECgwOUmFuZG9tIENvbXBhbnkxCzAJBgNVBAsMAklUMQ8wDQYDVQQDDAZu +c3EuaW8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrp/fU9Eu4HFIi +uH7JGgMjByv1l/887VUJOHXuf9s2pdfNBXI0Gy9zwmamdxun1KLDbdP5ujbjQOKa +KnOZLczaZRyol0dduw6nvh7PJAnUFlDIBC88rIWBBUfrcVU/zXXfkda9FCEZNRts +b+f3IskzHNW3K/OoyYmLS5JkluDtq8WGQ2vWdG8A7DaM19LivLqx+3oTZ/S68fso +2xwYp5ikbbOEfot824g2RJzqblr6CoxCttX0COo4C7G1EadW9MsZ3Xqbh7Xuo91R +2TOYUoOrK0eB6sPn5yr6wd8LUIS14Fuxdsnps6Xwjyz1Uq2LXrlUbbc4TJgIlB0l +mJIN/D1FAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEAh7Ne4ws7biLCPbp72Y52 +r7bXgYP2/DQZk3wegrwd4+Yj3LVhTrMMpHY1FAoL4Clo+nDHL2NC8P8cPPWxIhS7 +E8DhSHyMY/RR6q7Mdl1K7SlSy7YGK1N4KFiX8TPgjbs0Opg5MmoYIkKS54q8DHTB +2b4YIvnLCGEkXzo9MZNljZUXCmzaNn72iX76Qp0Pq9oJBA6N7LHx8j0Va1j2T184 +0z+u+1cP87HkuKGlTFqkRZYf0j/1ih2WSanSPSoZrhwAaJPbgkgjyVGQlraFe60m +9Bgdyj6MlEkr15AAo8jP+VsmkAE7Dj4liKQi8ZATRsgbtEBgugl57OEOZ85NTmW4 +uA== -----END CERTIFICATE REQUEST----- diff --git a/nsqadmin/test/server.key b/nsqadmin/test/server.key index 446b31820..aa338da8f 100644 --- a/nsqadmin/test/server.key +++ b/nsqadmin/test/server.key @@ -1,27 +1,28 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEAuYs7NerYpXWq/IPaBGriHobhIs/i4AJHra7QhZ5N/EfBCb0N -6K3tI4GRHMZ4lB0HwINWmxaPs6D2yDCxpGgnru6qCu0/91+Lq+GEZj+Fz1E2yfCq -tecTySvWf9en+SdTKFZTGGIAu3zFcozuX2fdhkjJ6ibZhnrXKlPU4IN0STkkRfFX -+yb/6P88mGh7PZKBb67Qw1bppzXE/SWgHVqDqu++whT1quwxnRhh/SHgwugN+6iK -uTDcJ1jQ1QWe+xna7Te6nNBUvL6dV49jpoDOjHsv+UaAvzNeHCHqypTC0wwYHXyg -TTAU+E20c2NOCC7P0PAid1liNeuuEWtM2bRrFQIDAQABAoIBABPzc7d1fDw2bd9f -Mic9cvkDWdwLbILX2+tCG+vyPMJ+2LP6Xy+A3DnwKbFlafvLL1U1Ci/8+hC/oymd -isx54qJ9yU0Je9JWtMcTpc/0zqefPPvz4/dRVKBSFWuDve0dnGR++8poZ1nBrd2G -Z+9cVMamtwd1i/hY5yAHCaHmoK9qxXuSjtbPkqDqruloGO5iT+tcICjAeWyJIx1P -5VJjuKDx4AhU4B8DpBSTtA02BKltvr2K6D4zhJ255oI4iLUkYk4IwxB7yZH+6Y++ -mDa6e8iM3ut+qMkCxto/CfMCqYfoRzmykiazZ5qFXfGwv3OkWUEOBXU//Vpklvnh -OQWYL/UCgYEA7mkKXbCrCNJEdly4LVLPKPFjVUPhMdXcqdnoKZ6BiVYFMqTuG4+w -o/Rf6ZpqZ3Rf656/ypd1atVvK2g4zfq3j1W6lDnpLjKaLhc8a+ZH4NWXBORIzlUW -aR2xVcPpAokor37FRAWbduiwVSCHlDtg48i+rvukyqmeRBKjrIgX3lsCgYEAxzut -5GiMZ9TkjqYXdlUDIDKWMHMfLfRY7+Q/cBdr7AfiMVw4PIWJG/IuxCGwGp77gRg6 -BeBsi8Htj5/EGbRiK4kjFyf8LqYGOeYLZ3I8+olr+tNmF4/yKwxku3VylpmrpCAV -/8emso1rAWo6Y98MTNSGgvLqhDU6OD7tTSv3908CgYA4+aVeio/1RbrSxonFWxri -3/0rLVOuAzv+43KWL6kpVwNa/QtiTs6aABbDzwFKxAcAWinfkp6e727n4rpgj2A6 -wvQZ5FUTk0hBZ5ArAReAZcr3gk7b8H2wlUYCBxWyY3Dzr8oY3XYvzqAFWAbOp/oZ -tanMS5swS6TlA8dVvhhmLQKBgGZwcBPOEctdcntKOSwVv/qxJ/oXZ0O4rHYENP4M -fOgqkYnxsdSkkH/3AUbFT4gQkJ6q90KIRyeA+gXsDudskUFzTMCeRZMyuGbSurBg -06u6NvQL+CVLVSf/QlgEpnt63f8QpF8Up8iM4CUlGoq5Z9ilOdhg0GZT+/BpopgY -cHIPAoGBAKyLumgeG+gMFK5x/Fi6zjBT5MK8Tw0VMkahW01Jx2laYibS/a8AEFmn -ySdrmLPkOmmWgXCk3m2m5PkvM5qH/KNugOA0+WX2CTvwt4ZgwWUalQ5R43wSIeDC -MXVfwC8uE66PmpYgmsu4H0vnCGfacOCQhfdq01SLobgBiQSrm/6D ------END RSA PRIVATE KEY----- +-----BEGIN PRIVATE KEY----- +MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCy/7ebzIezybQE +f0+5RS7XzK7QSlA/9V/otru8Dm4KM3p/U9Ne4ncIPwgkvTtoJym4GL76RFrPI7hB +X2vaWNdihZUp8sjbn33IzKFIoAoARLDkRJikp58H2Mkm0Lw680zmG6FufoMFkX2X +OAosg29CryWnV4b7tWnMHDU3zEpRajFostu/cgc+98sICAbkKpnA+hfp5l2z8ua7 +ghA3erXFp6oBRfa2W2+R3IKYBEuvxBWiPDuQ9kdzuB722HKEhmQUpjLd33zAh9e6 +i9niC56HbvOgLmBef8/0OKXobhimjskU86ZSgTgDNoNhXJoc486iH+HDwvWW4zQX +sfxCz1ZlAgMBAAECggEACswvgI/J79J5sCZt4g3bptuLVWKQ4grPNPPbnJsnkCii +zw4jcKnV5wLGXvul8GvMXHVBr/RySznVt5El/w805ECNSvErpJ6ZBoUxhXaso8TW +VtlnISeWCZx40IVEQC9vssHKmdEP3kTJ1Va6u7dXUtJ17Fj0pOJrS2C4OnFxr496 +bhgB1Aq7WuaKoH9OjL72sb4JNnNqKnT7XVlTEB92h9Y+yA1aZcSTTyE+KhWc8dAf +O1g9u5gIj7BXrd+QWRg4D/WRz8aQR88girnKqppReTjgZMuKREtG3BfLF/iYegsd +2TI7ftzU3TLOPlRd8TMu2wzSit8xhx6jr6OqqT4DAQKBgQDozYPv2R2pX80dMQad +4FJREJH2Yys2aR5kVhsCbkBULvofbgDtMuhGjaVrjqs8YN7p6pOF1yJGQJVH8fWU +hyotIkUAWTUUVco5zfhK+Dy5NoC+KmOE4XGLJgcndnhdWOzTeoir9HroAFko+he6 +seGdGvn03eisrCSluFP3L233FQKBgQDE1byypxeJG+n/UkLU7/mPs6PyRDVJGlyj +DfswDk9GyC/rNuBgxkH2cJ+Qj7VVoGsEd4rEJ8xPcT4qG6SO2+jf/X+Pl7j+7X+w +G71t/fK44WYeIFHIPspfnKJ666JML0Rfhd0TVc0WHitw831ogwZVj18Q6/TwLoLM +pjVgibW2EQKBgD69VDdJbgL9fIvHcJ8Pm1+ZdZzPMRAi2Dv2MKVBDTkix+m8fadv +NsX82n3YHzHQcYLc4xEI34XLVe/jt2ll2+n5+FqVsAZg8HUPm0CpEcRgeeXGCrf/ +AdicUQVDmkCd/IUp2rds1cq8fUrby5VW5xSt9nsVauVOJzo6KPbO43XZAoGAV6tz +Xoc53mHGeWgkSD+SgkTa8t8adLL/K8jgZmkZOkeTwEoy6iej3aYQDA1WEQtgXx73 +eaLYR1IDBDJHuzGLqah5FnXXegRCaSgR2VnQsDQEjcqLYotFDAzx+ZnWMeSjqYAw +FZqTvBQ3+RkadGBXg+hVyW2vLQMqUwh8ocD0ZGECgYBhBvvCNCgHnx4Tonhyz+IA +q4QQEF6a92ImCGPmlBKVbXTkCe1OiiZWPQZxk+RkaPwsUxghiKc/JL5xpzObKqB+ +l9nvNmNOa0Mtkv/ny/ZKM77zmaxVVKvpkK2LgZMdriJi2n7V12FL54zhYfUfXvzV +0PcBiHo1CfUjEc6Hf5hmkA== +-----END PRIVATE KEY----- diff --git a/nsqadmin/test/server.pem b/nsqadmin/test/server.pem index 12032e5f2..6aeca9556 100644 --- a/nsqadmin/test/server.pem +++ b/nsqadmin/test/server.pem @@ -1,18 +1,22 @@ -----BEGIN CERTIFICATE----- -MIIC3jCCAoigAwIBAgIJAJFBjQSZWSLmMA0GCSqGSIb3DQEBCwUAMA0xCzAJBgNV -BAMMAmNhMB4XDTE3MDkxNjE3NDQxNFoXDTI3MDkxNDE3NDQxNFowgYcxIzAhBgkq -hkiG9w0BCQEWFG1yZWlmZXJzb25AZ21haWwuY29tMQswCQYDVQQGEwJERTEMMAoG -A1UECBMDTlJXMQ4wDAYDVQQHEwVFYXJ0aDEXMBUGA1UEChMOUmFuZG9tIENvbXBh -bnkxCzAJBgNVBAsTAklUMQ8wDQYDVQQDEwZuc3EuaW8wggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQC5izs16tildar8g9oEauIehuEiz+LgAketrtCFnk38 -R8EJvQ3ore0jgZEcxniUHQfAg1abFo+zoPbIMLGkaCeu7qoK7T/3X4ur4YRmP4XP -UTbJ8Kq15xPJK9Z/16f5J1MoVlMYYgC7fMVyjO5fZ92GSMnqJtmGetcqU9Tgg3RJ -OSRF8Vf7Jv/o/zyYaHs9koFvrtDDVumnNcT9JaAdWoOq777CFPWq7DGdGGH9IeDC -6A37qIq5MNwnWNDVBZ77GdrtN7qc0FS8vp1Xj2OmgM6Mey/5RoC/M14cIerKlMLT -DBgdfKBNMBT4TbRzY04ILs/Q8CJ3WWI1664Ra0zZtGsVAgMBAAGjgYcwgYQwDAYD -VR0TAQH/BAIwADAdBgNVHQ4EFgQUt6UXJ8BQB++I/cQG5ZgaiUyqOE8wHwYDVR0j -BBgwFoAUzIvHuuMoF7/FlAudXMi6o01XPFEwDgYDVR0PAQH/BAQDAgWgMBMGA1Ud -JQQMMAoGCCsGAQUFBwMBMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQELBQAD -QQCCwm0F2eTmtIcKDxrXGZ7q9y9mfsROfYaCnH+vKUDw2vmqQkInzhLeEElDGQcR -ww0IKCnDHEruNb2tKyQM/70L +MIIDqzCCApOgAwIBAgIUKJhPa3EIQOpNAj+2oZ/piw+ubhcwDQYJKoZIhvcNAQEL +BQAwDTELMAkGA1UEAwwCY2EwHhcNMjYwNzE2MDQwOTAwWhcNMzYwNzEzMDQwOTAw +WjCBhzEjMCEGCSqGSIb3DQEJARYUbXJlaWZlcnNvbkBnbWFpbC5jb20xCzAJBgNV +BAYTAkRFMQwwCgYDVQQIDANOUlcxDjAMBgNVBAcMBUVhcnRoMRcwFQYDVQQKDA5S +YW5kb20gQ29tcGFueTELMAkGA1UECwwCSVQxDzANBgNVBAMMBm5zcS5pbzCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALL/t5vMh7PJtAR/T7lFLtfMrtBK +UD/1X+i2u7wObgozen9T017idwg/CCS9O2gnKbgYvvpEWs8juEFfa9pY12KFlSny +yNuffcjMoUigCgBEsOREmKSnnwfYySbQvDrzTOYboW5+gwWRfZc4CiyDb0KvJadX +hvu1acwcNTfMSlFqMWiy279yBz73ywgIBuQqmcD6F+nmXbPy5ruCEDd6tcWnqgFF +9rZbb5HcgpgES6/EFaI8O5D2R3O4HvbYcoSGZBSmMt3ffMCH17qL2eILnodu86Au +YF5/z/Q4pehuGKaOyRTzplKBOAM2g2FcmhzjzqIf4cPC9ZbjNBex/ELPVmUCAwEA +AaOBhzCBhDAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBTE0AsLEUJZWhvFagpX63pB +9yCi/jAfBgNVHSMEGDAWgBRIh7H/gNQSSCgduN4vOJLwxdvFvDAOBgNVHQ8BAf8E +BAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0RBAgwBocEfwAAATANBgkq +hkiG9w0BAQsFAAOCAQEAiznmYfrc4so69aYDZHAvG6Puz3VHe4UfjacaRy2LgSfX +vrkjY+OhUBGrl7ftEPizsxHGVxpoxuzIo6ft5nM9pMWlGBn7spta+J9inofSPsIa +wkaPJDCNLeB2Nuv9QYFSIugx0s9LIhyR9cHJoQJSre3QvMHCE+maKcP2gba8MRvD +ChtGA1gwQXkI8QxvMTNCH8mhZXCAI331TlP2/OPqdrHRPm57GFKbXziLUv5+TnXy +xxu7qbXSyiJN3Y27Nf/0O5+lJ32Q1H24HqVth34k8Ck2lrWZWbbgQ2e0ophKCpn6 +JCIHHkX82OKW7KsMC9PGAmL8Kcg+JWwyleBR6DZm6A== -----END CERTIFICATE----- diff --git a/nsqadmin/test/server.req b/nsqadmin/test/server.req index 1ccec009e..fd73e89d9 100644 --- a/nsqadmin/test/server.req +++ b/nsqadmin/test/server.req @@ -1,18 +1,18 @@ -----BEGIN CERTIFICATE REQUEST----- MIICzTCCAbUCAQAwgYcxIzAhBgkqhkiG9w0BCQEWFG1yZWlmZXJzb25AZ21haWwu -Y29tMQswCQYDVQQGEwJERTEMMAoGA1UECBMDTlJXMQ4wDAYDVQQHEwVFYXJ0aDEX -MBUGA1UEChMOUmFuZG9tIENvbXBhbnkxCzAJBgNVBAsTAklUMQ8wDQYDVQQDEwZu -c3EuaW8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC5izs16tildar8 -g9oEauIehuEiz+LgAketrtCFnk38R8EJvQ3ore0jgZEcxniUHQfAg1abFo+zoPbI -MLGkaCeu7qoK7T/3X4ur4YRmP4XPUTbJ8Kq15xPJK9Z/16f5J1MoVlMYYgC7fMVy -jO5fZ92GSMnqJtmGetcqU9Tgg3RJOSRF8Vf7Jv/o/zyYaHs9koFvrtDDVumnNcT9 -JaAdWoOq777CFPWq7DGdGGH9IeDC6A37qIq5MNwnWNDVBZ77GdrtN7qc0FS8vp1X -j2OmgM6Mey/5RoC/M14cIerKlMLTDBgdfKBNMBT4TbRzY04ILs/Q8CJ3WWI1664R -a0zZtGsVAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEASNjcoZbyNcwMQjMmNoil -S/7pCRn4aYzZIVjrVtOHQ9GHC23MSep5um2gIcMFPiuYyu9Byl8CSVtc1op2fAKS -vrugoZaCrp/A76hqOfNxgh7VmgTux8bG5Qcjaija1BNWpbyaWARdBxN/WgS5CpCj -u2yzv8mrzzFNrDMlsmiEMvtkMzdhiZ4YY8zm6CdrbIR5z1eqf4e+rs4oJtTKNNAD -hewk8CGiUW1hOx2jpjcIVMRy+ofVHRX2xQ6Sw8qxCNsiv8IPAAivgAbFJO76ZSbH -eQ7uKWszmBEroyFvZ0rfmFLXuopU125pyBDl5FUKYAZzCBx9tr5dROCbw/rXDhke -ig== +Y29tMQswCQYDVQQGEwJERTEMMAoGA1UECAwDTlJXMQ4wDAYDVQQHDAVFYXJ0aDEX +MBUGA1UECgwOUmFuZG9tIENvbXBhbnkxCzAJBgNVBAsMAklUMQ8wDQYDVQQDDAZu +c3EuaW8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCy/7ebzIezybQE +f0+5RS7XzK7QSlA/9V/otru8Dm4KM3p/U9Ne4ncIPwgkvTtoJym4GL76RFrPI7hB +X2vaWNdihZUp8sjbn33IzKFIoAoARLDkRJikp58H2Mkm0Lw680zmG6FufoMFkX2X +OAosg29CryWnV4b7tWnMHDU3zEpRajFostu/cgc+98sICAbkKpnA+hfp5l2z8ua7 +ghA3erXFp6oBRfa2W2+R3IKYBEuvxBWiPDuQ9kdzuB722HKEhmQUpjLd33zAh9e6 +i9niC56HbvOgLmBef8/0OKXobhimjskU86ZSgTgDNoNhXJoc486iH+HDwvWW4zQX +sfxCz1ZlAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEABjAP5B4FpTeHHwv0MMJB +762uHK2Jkt2Y5QWPqeZLV+E7PvImDFxShG0VRBIrZFu7trVy4J3xysIsEaaPorr/ +NoK4wwgCt3+xk6pJmLqOMDH6Mai0NgBF56fJZP/y9zKxTEGvK8ySJdPgfszNZNII +6XBi0ifsBIHiRPb9VwAdp0hRQZoV9xTLh9Ggy0VRODBrQTSefAosoiyx8ckPn//G +3SEDtTJa1HE0JJDULmxOpJY5OOv8G9iIWV2M2Wn+aDHHZ/Lk3cXg1tmX396T0vL6 +wtbE2qD9QwkANqN+wF2LqCmVSLDBvFxvtTEYPrb8JnQzZgNNJAhz4ZqWpx7KTIzv +pw== -----END CERTIFICATE REQUEST----- diff --git a/nsqd/channel.go b/nsqd/channel.go index d952ba6eb..4225aff98 100644 --- a/nsqd/channel.go +++ b/nsqd/channel.go @@ -188,18 +188,26 @@ func (c *Channel) exit(deleted bool) error { // this forceably closes client connections c.RLock() for _, client := range c.clients { - client.Close() + if err := client.Close(); err != nil { + c.nsqd.logf(LOG_ERROR, "CHANNEL(%s): failed to close client - %s", c.name, err) + } } c.RUnlock() if deleted { // empty the queue (deletes the backend files, too) - c.Empty() + err := c.Empty() + if err != nil { + return err + } return c.backend.Delete() } // write anything leftover to disk - c.flush() + err := c.flush() + if err != nil { + return err + } return c.backend.Close() } @@ -381,7 +389,9 @@ func (c *Channel) put(m *Message) error { func (c *Channel) PutMessageDeferred(msg *Message, timeout time.Duration) { atomic.AddUint64(&c.messageCount, 1) - c.StartDeferredTimeout(msg, timeout) + if err := c.StartDeferredTimeout(msg, timeout); err != nil { + c.nsqd.logf(LOG_ERROR, "CHANNEL(%s): failed to defer message - %s", c.name, err) + } } // TouchMessage resets the timeout for an in-flight message @@ -634,7 +644,11 @@ func (c *Channel) processDeferredQueue(t int64) bool { if err != nil { goto exit } - c.put(msg) + err = c.put(msg) + if err != nil { + c.nsqd.logf(LOG_ERROR, "CHANNEL(%s): failed to requeue deferred message - %s", c.name, err) + goto exit + } } exit: @@ -671,7 +685,11 @@ func (c *Channel) processInFlightQueue(t int64) bool { if ok { client.TimedOutMessage() } - c.put(msg) + err = c.put(msg) + if err != nil { + c.nsqd.logf(LOG_ERROR, "CHANNEL(%s): failed to requeue in-flight message - %s", c.name, err) + goto exit + } } exit: diff --git a/nsqd/channel_test.go b/nsqd/channel_test.go index f629aecb0..1581e27b5 100644 --- a/nsqd/channel_test.go +++ b/nsqd/channel_test.go @@ -17,7 +17,7 @@ func TestPutMessage(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_put_message" + strconv.Itoa(int(time.Now().Unix())) @@ -26,7 +26,8 @@ func TestPutMessage(t *testing.T) { var id MessageID msg := NewMessage(id, []byte("test")) - topic.PutMessage(msg) + err := topic.PutMessage(msg) + test.Nil(t, err) outputMsg := <-channel1.memoryMsgChan test.Equal(t, msg.ID, outputMsg.ID) @@ -38,7 +39,7 @@ func TestPutMessage2Chan(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_put_message_2chan" + strconv.Itoa(int(time.Now().Unix())) @@ -48,7 +49,8 @@ func TestPutMessage2Chan(t *testing.T) { var id MessageID msg := NewMessage(id, []byte("test")) - topic.PutMessage(msg) + err := topic.PutMessage(msg) + test.Nil(t, err) outputMsg1 := <-channel1.memoryMsgChan test.Equal(t, msg.ID, outputMsg1.ID) @@ -67,7 +69,7 @@ func TestInFlightWorker(t *testing.T) { opts.MsgTimeout = 100 * time.Millisecond opts.QueueScanRefreshInterval = 100 * time.Millisecond _, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_in_flight_worker" + strconv.Itoa(int(time.Now().Unix())) @@ -76,7 +78,8 @@ func TestInFlightWorker(t *testing.T) { for i := 0; i < count; i++ { msg := NewMessage(topic.GenerateID(), []byte("test")) - channel.StartInFlightTimeout(msg, 0, opts.MsgTimeout) + err := channel.StartInFlightTimeout(msg, 0, opts.MsgTimeout) + test.Nil(t, err) } channel.Lock() @@ -108,7 +111,7 @@ func TestChannelEmpty(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_channel_empty" + strconv.Itoa(int(time.Now().Unix())) @@ -118,17 +121,20 @@ func TestChannelEmpty(t *testing.T) { msgs := make([]*Message, 0, 25) for i := 0; i < 25; i++ { msg := NewMessage(topic.GenerateID(), []byte("test")) - channel.StartInFlightTimeout(msg, 0, opts.MsgTimeout) + err := channel.StartInFlightTimeout(msg, 0, opts.MsgTimeout) + test.Nil(t, err) msgs = append(msgs, msg) } - channel.RequeueMessage(0, msgs[len(msgs)-1].ID, 100*time.Millisecond) + err := channel.RequeueMessage(0, msgs[len(msgs)-1].ID, 100*time.Millisecond) + test.Nil(t, err) test.Equal(t, 24, len(channel.inFlightMessages)) test.Equal(t, 24, len(channel.inFlightPQ)) test.Equal(t, 1, len(channel.deferredMessages)) test.Equal(t, 1, len(channel.deferredPQ)) - channel.Empty() + err = channel.Empty() + test.Nil(t, err) test.Equal(t, 0, len(channel.inFlightMessages)) test.Equal(t, 0, len(channel.inFlightPQ)) @@ -141,11 +147,11 @@ func TestChannelEmptyConsumer(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, _ := mustConnectNSQD(tcpAddr) - defer conn.Close() + defer func() { _ = conn.Close() }() topicName := "test_channel_empty" + strconv.Itoa(int(time.Now().Unix())) topic := nsqd.GetTopic(topicName) @@ -157,7 +163,8 @@ func TestChannelEmptyConsumer(t *testing.T) { for i := 0; i < 25; i++ { msg := NewMessage(topic.GenerateID(), []byte("test")) - channel.StartInFlightTimeout(msg, 0, opts.MsgTimeout) + err = channel.StartInFlightTimeout(msg, 0, opts.MsgTimeout) + test.Nil(t, err) client.SendingMessage() } @@ -166,7 +173,8 @@ func TestChannelEmptyConsumer(t *testing.T) { test.Equal(t, int64(25), stats.InFlightCount) } - channel.Empty() + err = channel.Empty() + test.Nil(t, err) for _, cl := range channel.clients { stats := cl.Stats("").(ClientV2Stats) @@ -179,11 +187,11 @@ func TestMaxChannelConsumers(t *testing.T) { opts.Logger = test.NewTestLogger(t) opts.MaxChannelConsumers = 1 tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, _ := mustConnectNSQD(tcpAddr) - defer conn.Close() + defer func() { _ = conn.Close() }() topicName := "test_max_channel_consumers" + strconv.Itoa(int(time.Now().Unix())) topic := nsqd.GetTopic(topicName) @@ -206,7 +214,7 @@ func TestChannelHealth(t *testing.T) { opts.MemQueueSize = 2 _, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topic := nsqd.GetTopic("test") @@ -232,7 +240,8 @@ func TestChannelHealth(t *testing.T) { test.Nil(t, err) test.Equal(t, 500, resp.StatusCode) body, _ := io.ReadAll(resp.Body) - resp.Body.Close() + err = resp.Body.Close() + test.Nil(t, err) test.Equal(t, "NOK - never gonna happen", string(body)) channel.backend = &errorRecoveredBackendQueue{} @@ -245,6 +254,7 @@ func TestChannelHealth(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + err = resp.Body.Close() + test.Nil(t, err) test.Equal(t, "OK", string(body)) } diff --git a/nsqd/client_v2.go b/nsqd/client_v2.go index 62f637e4f..197ff7bd1 100644 --- a/nsqd/client_v2.go +++ b/nsqd/client_v2.go @@ -153,8 +153,9 @@ type clientV2 struct { net.Conn // connections based on negotiated features - tlsConn *tls.Conn - flateWriter *flate.Writer + tlsConn *tls.Conn + flateWriter *flate.Writer + snappyWriter *snappy.Writer // reading/writing interfaces Reader *bufio.Reader @@ -588,7 +589,9 @@ func (c *clientV2) UpgradeTLS() error { defer c.writeLock.Unlock() tlsConn := tls.Server(c.Conn, c.nsqd.tlsConfig) - tlsConn.SetDeadline(time.Now().Add(5 * time.Second)) + if err := tlsConn.SetDeadline(time.Now().Add(5 * time.Second)); err != nil { + return err + } err := tlsConn.Handshake() if err != nil { return err @@ -633,8 +636,10 @@ func (c *clientV2) UpgradeSnappy() error { } c.Reader = bufio.NewReaderSize(snappy.NewReader(conn), defaultBufferSize) - //lint:ignore SA1019 NewWriter is deprecated by NewBufferedWriter, but we're doing our own buffering - c.Writer = bufio.NewWriterSize(snappy.NewWriter(conn), c.OutputBufferSize) + + sw := snappy.NewBufferedWriter(conn) + c.snappyWriter = sw + c.Writer = bufio.NewWriterSize(sw, c.OutputBufferSize) atomic.StoreInt32(&c.Snappy, 1) @@ -644,9 +649,13 @@ func (c *clientV2) UpgradeSnappy() error { func (c *clientV2) Flush() error { var zeroTime time.Time if c.HeartbeatInterval > 0 { - c.SetWriteDeadline(time.Now().Add(c.HeartbeatInterval)) + if err := c.SetWriteDeadline(time.Now().Add(c.HeartbeatInterval)); err != nil { + return err + } } else { - c.SetWriteDeadline(zeroTime) + if err := c.SetWriteDeadline(zeroTime); err != nil { + return err + } } err := c.Writer.Flush() @@ -658,6 +667,10 @@ func (c *clientV2) Flush() error { return c.flateWriter.Flush() } + if c.snappyWriter != nil { + return c.snappyWriter.Flush() + } + return nil } diff --git a/nsqd/http.go b/nsqd/http.go index fdaf1d481..9c463f184 100644 --- a/nsqd/http.go +++ b/nsqd/http.go @@ -95,7 +95,7 @@ func newHTTPServer(nsqd *NSQD, tlsEnabled bool, tlsRequired bool) *httpServer { func setBlockRateHandler(w http.ResponseWriter, req *http.Request, ps httprouter.Params) (interface{}, error) { rate, err := strconv.Atoi(req.FormValue("rate")) if err != nil { - return nil, http_api.Err{http.StatusBadRequest, fmt.Sprintf("invalid block rate : %s", err.Error())} + return nil, http_api.Err{Code: http.StatusBadRequest, Text: fmt.Sprintf("invalid block rate : %s", err.Error())} } runtime.SetBlockProfileRate(rate) return nil, nil @@ -113,7 +113,7 @@ func (s *httpServer) ServeHTTP(w http.ResponseWriter, req *http.Request) { w.Header().Set("X-NSQ-Content-Type", "nsq; version=1.0") w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(403) - io.WriteString(w, resp) + _, _ = io.WriteString(w, resp) return } s.router.ServeHTTP(w, req) @@ -122,7 +122,7 @@ func (s *httpServer) ServeHTTP(w http.ResponseWriter, req *http.Request) { func (s *httpServer) pingHandler(w http.ResponseWriter, req *http.Request, ps httprouter.Params) (interface{}, error) { health := s.nsqd.GetHealth() if !s.nsqd.IsHealthy() { - return nil, http_api.Err{500, health} + return nil, http_api.Err{Code: 500, Text: health} } return health, nil } @@ -130,7 +130,7 @@ func (s *httpServer) pingHandler(w http.ResponseWriter, req *http.Request, ps ht func (s *httpServer) doInfo(w http.ResponseWriter, req *http.Request, ps httprouter.Params) (interface{}, error) { hostname, err := os.Hostname() if err != nil { - return nil, http_api.Err{500, err.Error()} + return nil, http_api.Err{Code: 500, Text: err.Error()} } tcpPort := -1 // in case of unix socket if s.nsqd.RealTCPAddr().Network() == "tcp" { @@ -174,17 +174,17 @@ func (s *httpServer) getExistingTopicFromQuery(req *http.Request) (*http_api.Req reqParams, err := http_api.NewReqParams(req) if err != nil { s.nsqd.logf(LOG_ERROR, "failed to parse request params - %s", err) - return nil, nil, "", http_api.Err{400, "INVALID_REQUEST"} + return nil, nil, "", http_api.Err{Code: 400, Text: "INVALID_REQUEST"} } topicName, channelName, err := http_api.GetTopicChannelArgs(reqParams) if err != nil { - return nil, nil, "", http_api.Err{400, err.Error()} + return nil, nil, "", http_api.Err{Code: 400, Text: err.Error()} } topic, err := s.nsqd.GetExistingTopic(topicName) if err != nil { - return nil, nil, "", http_api.Err{404, "TOPIC_NOT_FOUND"} + return nil, nil, "", http_api.Err{Code: 404, Text: "TOPIC_NOT_FOUND"} } return reqParams, topic, channelName, err @@ -194,17 +194,17 @@ func (s *httpServer) getTopicFromQuery(req *http.Request) (url.Values, *Topic, e reqParams, err := url.ParseQuery(req.URL.RawQuery) if err != nil { s.nsqd.logf(LOG_ERROR, "failed to parse request params - %s", err) - return nil, nil, http_api.Err{400, "INVALID_REQUEST"} + return nil, nil, http_api.Err{Code: 400, Text: "INVALID_REQUEST"} } topicNames, ok := reqParams["topic"] if !ok { - return nil, nil, http_api.Err{400, "MISSING_ARG_TOPIC"} + return nil, nil, http_api.Err{Code: 400, Text: "MISSING_ARG_TOPIC"} } topicName := topicNames[0] if !protocol.IsValidTopicName(topicName) { - return nil, nil, http_api.Err{400, "INVALID_TOPIC"} + return nil, nil, http_api.Err{Code: 400, Text: "INVALID_TOPIC"} } return reqParams, s.nsqd.GetTopic(topicName), nil @@ -215,7 +215,7 @@ func (s *httpServer) doPUB(w http.ResponseWriter, req *http.Request, ps httprout // to be able to fail "too big" requests before we even read if req.ContentLength > s.nsqd.getOpts().MaxMsgSize { - return nil, http_api.Err{413, "MSG_TOO_BIG"} + return nil, http_api.Err{Code: 413, Text: "MSG_TOO_BIG"} } // add 1 so that it's greater than our max when we test for it @@ -223,13 +223,13 @@ func (s *httpServer) doPUB(w http.ResponseWriter, req *http.Request, ps httprout readMax := s.nsqd.getOpts().MaxMsgSize + 1 body, err := io.ReadAll(io.LimitReader(req.Body, readMax)) if err != nil { - return nil, http_api.Err{500, "INTERNAL_ERROR"} + return nil, http_api.Err{Code: 500, Text: "INTERNAL_ERROR"} } if int64(len(body)) == readMax { - return nil, http_api.Err{413, "MSG_TOO_BIG"} + return nil, http_api.Err{Code: 413, Text: "MSG_TOO_BIG"} } if len(body) == 0 { - return nil, http_api.Err{400, "MSG_EMPTY"} + return nil, http_api.Err{Code: 400, Text: "MSG_EMPTY"} } reqParams, topic, err := s.getTopicFromQuery(req) @@ -242,11 +242,11 @@ func (s *httpServer) doPUB(w http.ResponseWriter, req *http.Request, ps httprout var di int64 di, err = strconv.ParseInt(ds[0], 10, 64) if err != nil { - return nil, http_api.Err{400, "INVALID_DEFER"} + return nil, http_api.Err{Code: 400, Text: "INVALID_DEFER"} } deferred = time.Duration(di) * time.Millisecond if deferred < 0 || deferred > s.nsqd.getOpts().MaxDeferTimeout { - return nil, http_api.Err{400, "INVALID_DEFER"} + return nil, http_api.Err{Code: 400, Text: "INVALID_DEFER"} } } @@ -254,7 +254,7 @@ func (s *httpServer) doPUB(w http.ResponseWriter, req *http.Request, ps httprout msg.deferred = deferred err = topic.PutMessage(msg) if err != nil { - return nil, http_api.Err{503, "EXITING"} + return nil, http_api.Err{Code: 503, Text: "EXITING"} } return "OK", nil @@ -268,7 +268,7 @@ func (s *httpServer) doMPUB(w http.ResponseWriter, req *http.Request, ps httprou // to be able to fail "too big" requests before we even read if req.ContentLength > s.nsqd.getOpts().MaxBodySize { - return nil, http_api.Err{413, "BODY_TOO_BIG"} + return nil, http_api.Err{Code: 413, Text: "BODY_TOO_BIG"} } reqParams, topic, err := s.getTopicFromQuery(req) @@ -289,7 +289,7 @@ func (s *httpServer) doMPUB(w http.ResponseWriter, req *http.Request, ps httprou msgs, err = readMPUB(req.Body, tmp, topic, s.nsqd.getOpts().MaxMsgSize, s.nsqd.getOpts().MaxBodySize) if err != nil { - return nil, http_api.Err{413, err.(*protocol.FatalClientErr).Code[2:]} + return nil, http_api.Err{Code: 413, Text: err.(*protocol.FatalClientErr).Code[2:]} } } else { // add 1 so that it's greater than our max when we test for it @@ -302,13 +302,13 @@ func (s *httpServer) doMPUB(w http.ResponseWriter, req *http.Request, ps httprou block, err = rdr.ReadBytes('\n') if err != nil { if err != io.EOF { - return nil, http_api.Err{500, "INTERNAL_ERROR"} + return nil, http_api.Err{Code: 500, Text: "INTERNAL_ERROR"} } exit = true } total += len(block) if int64(total) == readMax { - return nil, http_api.Err{413, "BODY_TOO_BIG"} + return nil, http_api.Err{Code: 413, Text: "BODY_TOO_BIG"} } if len(block) > 0 && block[len(block)-1] == '\n' { @@ -322,7 +322,7 @@ func (s *httpServer) doMPUB(w http.ResponseWriter, req *http.Request, ps httprou } if int64(len(block)) > s.nsqd.getOpts().MaxMsgSize { - return nil, http_api.Err{413, "MSG_TOO_BIG"} + return nil, http_api.Err{Code: 413, Text: "MSG_TOO_BIG"} } msg := NewMessage(topic.GenerateID(), block) @@ -332,7 +332,7 @@ func (s *httpServer) doMPUB(w http.ResponseWriter, req *http.Request, ps httprou err = topic.PutMessages(msgs) if err != nil { - return nil, http_api.Err{503, "EXITING"} + return nil, http_api.Err{Code: 503, Text: "EXITING"} } return "OK", nil @@ -347,26 +347,26 @@ func (s *httpServer) doEmptyTopic(w http.ResponseWriter, req *http.Request, ps h reqParams, err := http_api.NewReqParams(req) if err != nil { s.nsqd.logf(LOG_ERROR, "failed to parse request params - %s", err) - return nil, http_api.Err{400, "INVALID_REQUEST"} + return nil, http_api.Err{Code: 400, Text: "INVALID_REQUEST"} } topicName, err := reqParams.Get("topic") if err != nil { - return nil, http_api.Err{400, "MISSING_ARG_TOPIC"} + return nil, http_api.Err{Code: 400, Text: "MISSING_ARG_TOPIC"} } if !protocol.IsValidTopicName(topicName) { - return nil, http_api.Err{400, "INVALID_TOPIC"} + return nil, http_api.Err{Code: 400, Text: "INVALID_TOPIC"} } topic, err := s.nsqd.GetExistingTopic(topicName) if err != nil { - return nil, http_api.Err{404, "TOPIC_NOT_FOUND"} + return nil, http_api.Err{Code: 404, Text: "TOPIC_NOT_FOUND"} } err = topic.Empty() if err != nil { - return nil, http_api.Err{500, "INTERNAL_ERROR"} + return nil, http_api.Err{Code: 500, Text: "INTERNAL_ERROR"} } return nil, nil @@ -376,17 +376,17 @@ func (s *httpServer) doDeleteTopic(w http.ResponseWriter, req *http.Request, ps reqParams, err := http_api.NewReqParams(req) if err != nil { s.nsqd.logf(LOG_ERROR, "failed to parse request params - %s", err) - return nil, http_api.Err{400, "INVALID_REQUEST"} + return nil, http_api.Err{Code: 400, Text: "INVALID_REQUEST"} } topicName, err := reqParams.Get("topic") if err != nil { - return nil, http_api.Err{400, "MISSING_ARG_TOPIC"} + return nil, http_api.Err{Code: 400, Text: "MISSING_ARG_TOPIC"} } err = s.nsqd.DeleteExistingTopic(topicName) if err != nil { - return nil, http_api.Err{404, "TOPIC_NOT_FOUND"} + return nil, http_api.Err{Code: 404, Text: "TOPIC_NOT_FOUND"} } return nil, nil @@ -396,17 +396,17 @@ func (s *httpServer) doPauseTopic(w http.ResponseWriter, req *http.Request, ps h reqParams, err := http_api.NewReqParams(req) if err != nil { s.nsqd.logf(LOG_ERROR, "failed to parse request params - %s", err) - return nil, http_api.Err{400, "INVALID_REQUEST"} + return nil, http_api.Err{Code: 400, Text: "INVALID_REQUEST"} } topicName, err := reqParams.Get("topic") if err != nil { - return nil, http_api.Err{400, "MISSING_ARG_TOPIC"} + return nil, http_api.Err{Code: 400, Text: "MISSING_ARG_TOPIC"} } topic, err := s.nsqd.GetExistingTopic(topicName) if err != nil { - return nil, http_api.Err{404, "TOPIC_NOT_FOUND"} + return nil, http_api.Err{Code: 404, Text: "TOPIC_NOT_FOUND"} } if strings.Contains(req.URL.Path, "unpause") { @@ -416,14 +416,18 @@ func (s *httpServer) doPauseTopic(w http.ResponseWriter, req *http.Request, ps h } if err != nil { s.nsqd.logf(LOG_ERROR, "failure in %s - %s", req.URL.Path, err) - return nil, http_api.Err{500, "INTERNAL_ERROR"} + return nil, http_api.Err{Code: 500, Text: "INTERNAL_ERROR"} } // pro-actively persist metadata so in case of process failure // nsqd won't suddenly (un)pause a topic s.nsqd.Lock() - s.nsqd.PersistMetadata() + err = s.nsqd.PersistMetadata() s.nsqd.Unlock() + if err != nil { + s.nsqd.logf(LOG_ERROR, "failed to persist metadata - %s", err) + return nil, http_api.Err{Code: 500, Text: "INTERNAL_ERROR"} + } return nil, nil } @@ -444,12 +448,12 @@ func (s *httpServer) doEmptyChannel(w http.ResponseWriter, req *http.Request, ps channel, err := topic.GetExistingChannel(channelName) if err != nil { - return nil, http_api.Err{404, "CHANNEL_NOT_FOUND"} + return nil, http_api.Err{Code: 404, Text: "CHANNEL_NOT_FOUND"} } err = channel.Empty() if err != nil { - return nil, http_api.Err{500, "INTERNAL_ERROR"} + return nil, http_api.Err{Code: 500, Text: "INTERNAL_ERROR"} } return nil, nil @@ -463,7 +467,7 @@ func (s *httpServer) doDeleteChannel(w http.ResponseWriter, req *http.Request, p err = topic.DeleteExistingChannel(channelName) if err != nil { - return nil, http_api.Err{404, "CHANNEL_NOT_FOUND"} + return nil, http_api.Err{Code: 404, Text: "CHANNEL_NOT_FOUND"} } return nil, nil @@ -477,7 +481,7 @@ func (s *httpServer) doPauseChannel(w http.ResponseWriter, req *http.Request, ps channel, err := topic.GetExistingChannel(channelName) if err != nil { - return nil, http_api.Err{404, "CHANNEL_NOT_FOUND"} + return nil, http_api.Err{Code: 404, Text: "CHANNEL_NOT_FOUND"} } if strings.Contains(req.URL.Path, "unpause") { @@ -487,14 +491,18 @@ func (s *httpServer) doPauseChannel(w http.ResponseWriter, req *http.Request, ps } if err != nil { s.nsqd.logf(LOG_ERROR, "failure in %s - %s", req.URL.Path, err) - return nil, http_api.Err{500, "INTERNAL_ERROR"} + return nil, http_api.Err{Code: 500, Text: "INTERNAL_ERROR"} } // pro-actively persist metadata so in case of process failure // nsqd won't suddenly (un)pause a channel s.nsqd.Lock() - s.nsqd.PersistMetadata() + err = s.nsqd.PersistMetadata() s.nsqd.Unlock() + if err != nil { + s.nsqd.logf(LOG_ERROR, "failed to persist metadata - %s", err) + return nil, http_api.Err{Code: 500, Text: "INTERNAL_ERROR"} + } return nil, nil } @@ -502,7 +510,7 @@ func (s *httpServer) doStats(w http.ResponseWriter, req *http.Request, ps httpro reqParams, err := http_api.NewReqParams(req) if err != nil { s.nsqd.logf(LOG_ERROR, "failed to parse request params - %s", err) - return nil, http_api.Err{400, "INVALID_REQUEST"} + return nil, http_api.Err{Code: 400, Text: "INVALID_REQUEST"} } formatString, _ := reqParams.Get("format") topicName, _ := reqParams.Get("topic") @@ -634,10 +642,10 @@ func (s *httpServer) doConfig(w http.ResponseWriter, req *http.Request, ps httpr readMax := s.nsqd.getOpts().MaxMsgSize + 1 body, err := io.ReadAll(io.LimitReader(req.Body, readMax)) if err != nil { - return nil, http_api.Err{500, "INTERNAL_ERROR"} + return nil, http_api.Err{Code: 500, Text: "INTERNAL_ERROR"} } if int64(len(body)) == readMax || len(body) == 0 { - return nil, http_api.Err{413, "INVALID_VALUE"} + return nil, http_api.Err{Code: 413, Text: "INVALID_VALUE"} } opts := *s.nsqd.getOpts() @@ -645,17 +653,17 @@ func (s *httpServer) doConfig(w http.ResponseWriter, req *http.Request, ps httpr case "nsqlookupd_tcp_addresses": err := json.Unmarshal(body, &opts.NSQLookupdTCPAddresses) if err != nil { - return nil, http_api.Err{400, "INVALID_VALUE"} + return nil, http_api.Err{Code: 400, Text: "INVALID_VALUE"} } case "log_level": logLevelStr := string(body) logLevel, err := lg.ParseLogLevel(logLevelStr) if err != nil { - return nil, http_api.Err{400, "INVALID_VALUE"} + return nil, http_api.Err{Code: 400, Text: "INVALID_VALUE"} } opts.LogLevel = logLevel default: - return nil, http_api.Err{400, "INVALID_OPTION"} + return nil, http_api.Err{Code: 400, Text: "INVALID_OPTION"} } s.nsqd.swapOpts(&opts) s.nsqd.triggerOptsNotification() @@ -663,7 +671,7 @@ func (s *httpServer) doConfig(w http.ResponseWriter, req *http.Request, ps httpr v, ok := getOptByCfgName(s.nsqd.getOpts(), opt) if !ok { - return nil, http_api.Err{400, "INVALID_OPTION"} + return nil, http_api.Err{Code: 400, Text: "INVALID_OPTION"} } return v, nil @@ -680,7 +688,7 @@ func getOptByCfgName(opts interface{}, name string) (interface{}, bool) { continue } if cfgName == "" { - cfgName = strings.Replace(flagName, "-", "_", -1) + cfgName = strings.ReplaceAll(flagName, "-", "_") } if name != cfgName { continue diff --git a/nsqd/http_test.go b/nsqd/http_test.go index 5fdb9b3d3..56493aa85 100644 --- a/nsqd/http_test.go +++ b/nsqd/http_test.go @@ -1,5 +1,7 @@ package nsqd +//nolint:errcheck + import ( "bytes" "crypto/tls" @@ -40,7 +42,7 @@ func TestHTTPpub(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_http_pub" + strconv.Itoa(int(time.Now().Unix())) @@ -50,7 +52,7 @@ func TestHTTPpub(t *testing.T) { url := fmt.Sprintf("http://%s/pub?topic=%s", httpAddr, topicName) resp, err := http.Post(url, "application/octet-stream", buf) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() body, _ := io.ReadAll(resp.Body) test.Equal(t, "OK", string(body)) @@ -63,7 +65,7 @@ func TestHTTPpubEmpty(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_http_pub_empty" + strconv.Itoa(int(time.Now().Unix())) @@ -73,7 +75,7 @@ func TestHTTPpubEmpty(t *testing.T) { url := fmt.Sprintf("http://%s/pub?topic=%s", httpAddr, topicName) resp, err := http.Post(url, "application/octet-stream", buf) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() body, _ := io.ReadAll(resp.Body) test.Equal(t, 400, resp.StatusCode) test.Equal(t, `{"message":"MSG_EMPTY"}`, string(body)) @@ -87,7 +89,7 @@ func TestHTTPmpub(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_http_mpub" + strconv.Itoa(int(time.Now().Unix())) @@ -103,7 +105,7 @@ func TestHTTPmpub(t *testing.T) { url := fmt.Sprintf("http://%s/mpub?topic=%s", httpAddr, topicName) resp, err := http.Post(url, "application/octet-stream", buf) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() body, _ := io.ReadAll(resp.Body) test.Equal(t, "OK", string(body)) @@ -116,7 +118,7 @@ func TestHTTPmpubEmpty(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_http_mpub_empty" + strconv.Itoa(int(time.Now().Unix())) @@ -134,7 +136,7 @@ func TestHTTPmpubEmpty(t *testing.T) { url := fmt.Sprintf("http://%s/mpub?topic=%s", httpAddr, topicName) resp, err := http.Post(url, "application/octet-stream", buf) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() body, _ := io.ReadAll(resp.Body) test.Equal(t, "OK", string(body)) @@ -147,7 +149,7 @@ func TestHTTPmpubBinary(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_http_mpub_bin" + strconv.Itoa(int(time.Now().Unix())) @@ -163,7 +165,7 @@ func TestHTTPmpubBinary(t *testing.T) { url := fmt.Sprintf("http://%s/mpub?topic=%s&binary=true", httpAddr, topicName) resp, err := http.Post(url, "application/octet-stream", buf) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() body, _ := io.ReadAll(resp.Body) test.Equal(t, "OK", string(body)) @@ -176,7 +178,7 @@ func TestHTTPmpubForNonNormalizedBinaryParam(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_http_mpub_bin" + strconv.Itoa(int(time.Now().Unix())) @@ -192,7 +194,7 @@ func TestHTTPmpubForNonNormalizedBinaryParam(t *testing.T) { url := fmt.Sprintf("http://%s/mpub?topic=%s&binary=non_normalized_binary_param", httpAddr, topicName) resp, err := http.Post(url, "application/octet-stream", buf) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() body, _ := io.ReadAll(resp.Body) test.Equal(t, "OK", string(body)) @@ -205,7 +207,7 @@ func TestHTTPpubDefer(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_http_pub_defer" + strconv.Itoa(int(time.Now().Unix())) @@ -216,7 +218,7 @@ func TestHTTPpubDefer(t *testing.T) { url := fmt.Sprintf("http://%s/pub?topic=%s&defer=%d", httpAddr, topicName, 1000) resp, err := http.Post(url, "application/octet-stream", buf) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() body, _ := io.ReadAll(resp.Body) test.Equal(t, "OK", string(body)) @@ -236,7 +238,7 @@ func TestHTTPSRequire(t *testing.T) { opts.TLSKey = "./test/certs/server.key" opts.TLSClientAuthPolicy = "require" _, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_http_pub_req" + strconv.Itoa(int(time.Now().Unix())) @@ -264,7 +266,7 @@ func TestHTTPSRequire(t *testing.T) { url = fmt.Sprintf("https://%s/pub?topic=%s", httpsAddr, topicName) resp, err = client.Post(url, "application/octet-stream", buf) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() body, _ := io.ReadAll(resp.Body) test.Equal(t, "OK", string(body)) @@ -282,7 +284,7 @@ func TestHTTPSRequireVerify(t *testing.T) { opts.TLSRootCAFile = "./test/certs/ca.pem" opts.TLSClientAuthPolicy = "require-verify" _, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() httpsAddr := nsqd.httpsListener.Addr().(*net.TCPAddr) @@ -328,7 +330,7 @@ func TestHTTPSRequireVerify(t *testing.T) { url = fmt.Sprintf("https://%s/pub?topic=%s", httpsAddr, topicName) resp, err = client.Post(url, "application/octet-stream", buf) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() body, _ := io.ReadAll(resp.Body) test.Equal(t, "OK", string(body)) @@ -347,7 +349,7 @@ func TestTLSRequireVerifyExceptHTTP(t *testing.T) { opts.TLSClientAuthPolicy = "require-verify" opts.TLSRequired = TLSRequiredExceptHTTP _, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_http_req_verf_except_http" + strconv.Itoa(int(time.Now().Unix())) @@ -358,7 +360,7 @@ func TestTLSRequireVerifyExceptHTTP(t *testing.T) { url := fmt.Sprintf("http://%s/pub?topic=%s", httpAddr, topicName) resp, err := http.Post(url, "application/octet-stream", buf) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() body, _ := io.ReadAll(resp.Body) test.Equal(t, "OK", string(body)) @@ -371,7 +373,7 @@ func TestHTTPV1TopicChannel(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_http_topic_channel2" + strconv.Itoa(int(time.Now().Unix())) @@ -382,7 +384,7 @@ func TestHTTPV1TopicChannel(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ := io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() test.Equal(t, "", string(body)) test.Equal(t, "nsq; version=1.0", resp.Header.Get("X-NSQ-Content-Type")) @@ -391,7 +393,7 @@ func TestHTTPV1TopicChannel(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() test.Equal(t, "", string(body)) test.Equal(t, "nsq; version=1.0", resp.Header.Get("X-NSQ-Content-Type")) @@ -411,7 +413,7 @@ func TestHTTPV1TopicChannel(t *testing.T) { test.Equal(t, 400, resp.StatusCode) test.Equal(t, "Bad Request", http.StatusText(resp.StatusCode)) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -424,7 +426,7 @@ func TestHTTPV1TopicChannel(t *testing.T) { test.Equal(t, 404, resp.StatusCode) test.Equal(t, "Not Found", http.StatusText(resp.StatusCode)) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -436,7 +438,7 @@ func TestHTTPV1TopicChannel(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() test.Equal(t, "", string(body)) test.Equal(t, "nsq; version=1.0", resp.Header.Get("X-NSQ-Content-Type")) @@ -447,7 +449,7 @@ func TestHTTPV1TopicChannel(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() test.Equal(t, "", string(body)) test.Equal(t, "nsq; version=1.0", resp.Header.Get("X-NSQ-Content-Type")) @@ -458,7 +460,7 @@ func TestHTTPV1TopicChannel(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() test.Equal(t, "", string(body)) test.Equal(t, "nsq; version=1.0", resp.Header.Get("X-NSQ-Content-Type")) @@ -469,7 +471,7 @@ func TestHTTPV1TopicChannel(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() test.Equal(t, "", string(body)) test.Equal(t, "nsq; version=1.0", resp.Header.Get("X-NSQ-Content-Type")) @@ -480,7 +482,7 @@ func TestHTTPV1TopicChannel(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() test.Equal(t, "", string(body)) test.Equal(t, "nsq; version=1.0", resp.Header.Get("X-NSQ-Content-Type")) @@ -492,7 +494,7 @@ func TestHTTPV1TopicChannel(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() test.Equal(t, "", string(body)) test.Equal(t, "nsq; version=1.0", resp.Header.Get("X-NSQ-Content-Type")) @@ -506,12 +508,12 @@ func TestHTTPClientStats(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) tcpAddr, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, nil, frameTypeResponse) sub(t, conn, topicName, "ch") @@ -568,7 +570,7 @@ func TestHTTPgetStatusJSON(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() nsqd.startTime = testTime @@ -577,7 +579,7 @@ func TestHTTPgetStatusJSON(t *testing.T) { url := fmt.Sprintf("http://%s/stats?format=json", httpAddr) resp, err := http.Get(url) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() body, _ := io.ReadAll(resp.Body) test.Equal(t, 200, resp.StatusCode) test.Equal(t, true, strings.HasPrefix(string(body), expectedJSON)) @@ -588,7 +590,7 @@ func TestHTTPgetStatusText(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() nsqd.startTime = testTime @@ -596,7 +598,7 @@ func TestHTTPgetStatusText(t *testing.T) { url := fmt.Sprintf("http://%s/stats?format=text", httpAddr) resp, err := http.Get(url) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() body, _ := io.ReadAll(resp.Body) test.Equal(t, 200, resp.StatusCode) test.NotNil(t, body) @@ -616,13 +618,13 @@ func TestHTTPconfig(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() url := fmt.Sprintf("http://%s/config/nsqlookupd_tcp_addresses", httpAddr) resp, err := http.Get(url) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() body, _ := io.ReadAll(resp.Body) test.Equal(t, 200, resp.StatusCode) test.Equal(t, "[]", string(body)) @@ -634,7 +636,7 @@ func TestHTTPconfig(t *testing.T) { test.Nil(t, err) resp, err = client.Do(req) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() body, _ = io.ReadAll(resp.Body) test.Equal(t, 200, resp.StatusCode) test.Equal(t, addrs, string(body)) @@ -644,7 +646,7 @@ func TestHTTPconfig(t *testing.T) { test.Nil(t, err) resp, err = client.Do(req) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() _, _ = io.ReadAll(resp.Body) test.Equal(t, 200, resp.StatusCode) test.Equal(t, LOG_FATAL, nsqd.getOpts().LogLevel) @@ -654,7 +656,7 @@ func TestHTTPconfig(t *testing.T) { test.Nil(t, err) resp, err = client.Do(req) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() _, _ = io.ReadAll(resp.Body) test.Equal(t, 400, resp.StatusCode) } @@ -663,13 +665,13 @@ func TestHTTPerrors(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() url := fmt.Sprintf("http://%s/stats", httpAddr) resp, err := http.Post(url, "text/plain", nil) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() body, _ := io.ReadAll(resp.Body) test.Equal(t, 405, resp.StatusCode) test.Equal(t, `{"message":"METHOD_NOT_ALLOWED"}`, string(body)) @@ -677,7 +679,7 @@ func TestHTTPerrors(t *testing.T) { url = fmt.Sprintf("http://%s/not_found", httpAddr) resp, err = http.Get(url) test.Nil(t, err) - defer resp.Body.Close() + defer func() { _ = resp.Body.Close() }() body, _ = io.ReadAll(resp.Body) test.Equal(t, 404, resp.StatusCode) test.Equal(t, `{"message":"NOT_FOUND"}`, string(body)) @@ -687,7 +689,7 @@ func TestDeleteTopic(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() em := ErrMessage{} @@ -698,7 +700,7 @@ func TestDeleteTopic(t *testing.T) { test.Equal(t, 400, resp.StatusCode) test.Equal(t, "Bad Request", http.StatusText(resp.StatusCode)) body, _ := io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -713,7 +715,7 @@ func TestDeleteTopic(t *testing.T) { test.Equal(t, 404, resp.StatusCode) test.Equal(t, "Not Found", http.StatusText(resp.StatusCode)) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -726,7 +728,7 @@ func TestDeleteTopic(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) test.Equal(t, []byte(""), body) @@ -736,7 +738,7 @@ func TestEmptyTopic(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() em := ErrMessage{} @@ -747,7 +749,7 @@ func TestEmptyTopic(t *testing.T) { test.Equal(t, 400, resp.StatusCode) test.Equal(t, "Bad Request", http.StatusText(resp.StatusCode)) body, _ := io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -762,7 +764,7 @@ func TestEmptyTopic(t *testing.T) { test.Equal(t, 400, resp.StatusCode) test.Equal(t, "Bad Request", http.StatusText(resp.StatusCode)) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -775,7 +777,7 @@ func TestEmptyTopic(t *testing.T) { test.Equal(t, 404, resp.StatusCode) test.Equal(t, "Not Found", http.StatusText(resp.StatusCode)) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -788,7 +790,7 @@ func TestEmptyTopic(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) test.Equal(t, []byte(""), body) @@ -798,7 +800,7 @@ func TestEmptyChannel(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() em := ErrMessage{} @@ -809,7 +811,7 @@ func TestEmptyChannel(t *testing.T) { test.Equal(t, 400, resp.StatusCode) test.Equal(t, "Bad Request", http.StatusText(resp.StatusCode)) body, _ := io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -824,7 +826,7 @@ func TestEmptyChannel(t *testing.T) { test.Equal(t, 400, resp.StatusCode) test.Equal(t, "Bad Request", http.StatusText(resp.StatusCode)) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -839,7 +841,7 @@ func TestEmptyChannel(t *testing.T) { test.Equal(t, 404, resp.StatusCode) test.Equal(t, "Not Found", http.StatusText(resp.StatusCode)) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -854,7 +856,7 @@ func TestEmptyChannel(t *testing.T) { test.Equal(t, 404, resp.StatusCode) test.Equal(t, "Not Found", http.StatusText(resp.StatusCode)) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -867,7 +869,7 @@ func TestEmptyChannel(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) test.Equal(t, []byte(""), body) @@ -877,7 +879,7 @@ func TestInfo(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() info := InfoDoc{} @@ -887,7 +889,7 @@ func TestInfo(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ := io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &info) @@ -902,7 +904,7 @@ func BenchmarkHTTPpub(b *testing.B) { opts.Logger = test.NewTestLogger(b) opts.MemQueueSize = int64(b.N) _, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() msg := make([]byte, 256) topicName := "bench_http_pub" + strconv.Itoa(int(time.Now().Unix())) url := fmt.Sprintf("http://%s/pub?topic=%s", httpAddr, topicName) @@ -925,7 +927,7 @@ func BenchmarkHTTPpub(b *testing.B) { if !bytes.Equal(body, []byte("OK")) { panic("bad response") } - resp.Body.Close() + _ = resp.Body.Close() } wg.Done() }() diff --git a/nsqd/lookup.go b/nsqd/lookup.go index fbbd80192..3c1f39898 100644 --- a/nsqd/lookup.go +++ b/nsqd/lookup.go @@ -25,7 +25,7 @@ func connectCallback(n *NSQD, hostname string) func(*lookupPeer) { cmd, err := nsq.Identify(ci) if err != nil { - lp.Close() + _ = lp.Close() return } @@ -35,14 +35,14 @@ func connectCallback(n *NSQD, hostname string) func(*lookupPeer) { return } else if bytes.Equal(resp, []byte("E_INVALID")) { n.logf(LOG_INFO, "LOOKUPD(%s): lookupd returned %s", lp, resp) - lp.Close() + _ = lp.Close() return } err = json.Unmarshal(resp, &lp.Info) if err != nil { n.logf(LOG_ERROR, "LOOKUPD(%s): parsing response - %s", lp, resp) - lp.Close() + _ = lp.Close() return } n.logf(LOG_INFO, "LOOKUPD(%s): peer info %+v", lp, lp.Info) @@ -100,7 +100,11 @@ func (n *NSQD) lookupLoop() { n.logf(LOG_INFO, "LOOKUP(%s): adding peer", host) lookupPeer := newLookupPeer(host, n.getOpts().MaxBodySize, n.logf, connectCallback(n, hostname)) - lookupPeer.Command(nil) // start the connection + if _, err := lookupPeer.Command(nil); err != nil { // start the connection + n.logf(LOG_ERROR, "LOOKUP(%s): failed to start connection - %s", host, err) + _ = lookupPeer.Close() + continue + } lookupPeers = append(lookupPeers, lookupPeer) lookupAddrs = append(lookupAddrs, host) } @@ -161,7 +165,7 @@ func (n *NSQD) lookupLoop() { continue } n.logf(LOG_INFO, "LOOKUP(%s): removing peer", lp) - lp.Close() + _ = lp.Close() } lookupPeers = tmpPeers lookupAddrs = tmpAddrs diff --git a/nsqd/lookup_peer.go b/nsqd/lookup_peer.go index 867e7f652..ed1755a59 100644 --- a/nsqd/lookup_peer.go +++ b/nsqd/lookup_peer.go @@ -65,13 +65,17 @@ func (lp *lookupPeer) String() string { // Read implements the io.Reader interface, adding deadlines func (lp *lookupPeer) Read(data []byte) (int, error) { - lp.conn.SetReadDeadline(time.Now().Add(time.Second)) + if err := lp.conn.SetReadDeadline(time.Now().Add(time.Second)); err != nil { + return 0, err + } return lp.conn.Read(data) } // Write implements the io.Writer interface, adding deadlines func (lp *lookupPeer) Write(data []byte) (int, error) { - lp.conn.SetWriteDeadline(time.Now().Add(time.Second)) + if err := lp.conn.SetWriteDeadline(time.Now().Add(time.Second)); err != nil { + return 0, err + } return lp.conn.Write(data) } @@ -100,7 +104,7 @@ func (lp *lookupPeer) Command(cmd *nsq.Command) ([]byte, error) { lp.state = stateConnected _, err = lp.Write(nsq.MagicV1) if err != nil { - lp.Close() + _ = lp.Close() return nil, err } if initialState == stateDisconnected { @@ -115,12 +119,12 @@ func (lp *lookupPeer) Command(cmd *nsq.Command) ([]byte, error) { } _, err := cmd.WriteTo(lp) if err != nil { - lp.Close() + _ = lp.Close() return nil, err } resp, err := readResponseBounded(lp, lp.maxBodySize) if err != nil { - lp.Close() + _ = lp.Close() return nil, err } return resp, nil diff --git a/nsqd/nsqd.go b/nsqd/nsqd.go index 523d1665b..7f2e0b1ed 100644 --- a/nsqd/nsqd.go +++ b/nsqd/nsqd.go @@ -180,9 +180,9 @@ func New(opts *Options) (*NSQD, error) { } if opts.StatsdPrefix != "" { - var port string = fmt.Sprint(opts.BroadcastHTTPPort) + port := fmt.Sprint(opts.BroadcastHTTPPort) statsdHostKey := statsd.HostKey(net.JoinHostPort(opts.BroadcastAddress, port)) - prefixWithHost := strings.Replace(opts.StatsdPrefix, "%s", statsdHostKey, -1) + prefixWithHost := strings.ReplaceAll(opts.StatsdPrefix, "%s", statsdHostKey) if prefixWithHost[len(prefixWithHost)-1] != '.' { prefixWithHost += "." } @@ -335,7 +335,10 @@ func writeSyncFile(fn string, data []byte) error { if err == nil { err = f.Sync() } - f.Close() + closeErr := f.Close() + if err == nil { + err = closeErr + } return err } @@ -366,7 +369,9 @@ func (n *NSQD) LoadMetadata() error { } topic := n.GetTopic(t.Name) if t.Paused { - topic.Pause() + if err := topic.Pause(); err != nil { + n.logf(LOG_ERROR, "TOPIC(%s): failed to pause while loading metadata - %s", t.Name, err) + } } for _, c := range t.Channels { if !protocol.IsValidChannelName(c.Name) { @@ -375,7 +380,9 @@ func (n *NSQD) LoadMetadata() error { } channel := topic.GetChannel(c.Name) if c.Paused { - channel.Pause() + if err := channel.Pause(); err != nil { + n.logf(LOG_ERROR, "CHANNEL(%s): failed to pause while loading metadata - %s", c.Name, err) + } } } topic.Start() @@ -445,7 +452,7 @@ func (n *NSQD) Exit() { return } if n.tcpListener != nil { - n.tcpListener.Close() + _ = n.tcpListener.Close() } if n.tcpServer != nil { @@ -453,11 +460,11 @@ func (n *NSQD) Exit() { } if n.httpListener != nil { - n.httpListener.Close() + _ = n.httpListener.Close() } if n.httpsListener != nil { - n.httpsListener.Close() + _ = n.httpsListener.Close() } n.Lock() @@ -467,14 +474,18 @@ func (n *NSQD) Exit() { } n.logf(LOG_INFO, "NSQ: closing topics") for _, topic := range n.topicMap { - topic.Close() + if err := topic.Close(); err != nil { + n.logf(LOG_ERROR, "TOPIC(%s): close failed - %s", topic.name, err) + } } n.Unlock() n.logf(LOG_INFO, "NSQ: stopping subsystems") close(n.exitChan) n.waitGroup.Wait() - n.dl.Unlock() + if err := n.dl.Unlock(); err != nil { + n.logf(LOG_ERROR, "failed to unlock data path - %s", err) + } n.logf(LOG_INFO, "NSQ: bye") n.ctxCancel() } @@ -498,7 +509,7 @@ func (n *NSQD) GetTopic(topicName string) *Topic { return t } deleteCallback := func(t *Topic) { - n.DeleteExistingTopic(t.name) + _ = n.DeleteExistingTopic(t.name) } t = NewTopic(topicName, n, deleteCallback) n.topicMap[topicName] = t @@ -564,7 +575,9 @@ func (n *NSQD) DeleteExistingTopic(topicName string) error { // we do this before removing the topic from map below (with no lock) // so that any incoming writes will error and not create a new topic // to enforce ordering - topic.Delete() + if err := topic.Delete(); err != nil { + return err + } n.Lock() delete(n.topicMap, topicName) @@ -734,7 +747,7 @@ func buildTLSConfig(opts *Options) (*tls.Config, error) { return nil, nil } - tlsClientAuthPolicy := tls.VerifyClientCertIfGiven + tlsClientAuthPolicy := tls.NoClientCert cert, err := tls.LoadX509KeyPair(opts.TLSCert, opts.TLSKey) if err != nil { @@ -745,8 +758,6 @@ func buildTLSConfig(opts *Options) (*tls.Config, error) { tlsClientAuthPolicy = tls.RequireAnyClientCert case "require-verify": tlsClientAuthPolicy = tls.RequireAndVerifyClientCert - default: - tlsClientAuthPolicy = tls.NoClientCert } tlsConfig = &tls.Config{ diff --git a/nsqd/nsqd_test.go b/nsqd/nsqd_test.go index 2351854c8..352bd9076 100644 --- a/nsqd/nsqd_test.go +++ b/nsqd/nsqd_test.go @@ -48,7 +48,7 @@ func TestStartup(t *testing.T) { opts.MemQueueSize = 100 opts.MaxBytesPerFile = 10240 _, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() origDataPath := opts.DataPath @@ -69,14 +69,16 @@ func TestStartup(t *testing.T) { m, err := getMetadata(nsqd) test.Nil(t, err) test.Equal(t, 0, len(m.Topics)) - nsqd.DeleteExistingTopic(topicName) + err = nsqd.DeleteExistingTopic(topicName) + test.Nil(t, err) atomic.StoreInt32(&nsqd.isLoading, 0) body := make([]byte, 256) topic := nsqd.GetTopic(topicName) for i := 0; i < iterations; i++ { msg := NewMessage(topic.GenerateID(), body) - topic.PutMessage(msg) + err := topic.PutMessage(msg) + test.Nil(t, err) } t.Logf("pulling from channel") @@ -93,10 +95,7 @@ func TestStartup(t *testing.T) { test.Equal(t, body, msg.Body) } - for { - if channel1.Depth() == int64(iterations/2) { - break - } + for channel1.Depth() != int64(iterations/2) { time.Sleep(50 * time.Millisecond) } @@ -131,10 +130,7 @@ func TestStartup(t *testing.T) { channel1 = topic.GetChannel("ch1") - for { - if channel1.Depth() == int64(iterations/2) { - break - } + for channel1.Depth() != int64(iterations/2) { time.Sleep(50 * time.Millisecond) } @@ -163,7 +159,7 @@ func TestEphemeralTopicsAndChannels(t *testing.T) { opts.Logger = test.NewTestLogger(t) opts.MemQueueSize = 100 _, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() topicName := "ephemeral_topic" + strconv.Itoa(int(time.Now().Unix())) + "#ephemeral" doneExitChan := make(chan int) @@ -183,7 +179,8 @@ func TestEphemeralTopicsAndChannels(t *testing.T) { test.Equal(t, err, nil) msg := NewMessage(topic.GenerateID(), body) - topic.PutMessage(msg) + err = topic.PutMessage(msg) + test.Nil(t, err) msg = <-ephemeralChannel.memoryMsgChan test.Equal(t, body, msg.Body) @@ -209,7 +206,7 @@ func TestPauseMetadata(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() // avoid concurrency issue of async PersistMetadata() calls @@ -218,7 +215,8 @@ func TestPauseMetadata(t *testing.T) { topic := nsqd.GetTopic(topicName) channel := topic.GetChannel("ch") atomic.StoreInt32(&nsqd.isLoading, 0) - nsqd.PersistMetadata() + err := nsqd.PersistMetadata() + test.Nil(t, err) var isPaused = func(n *NSQD, topicIndex int, channelIndex int) bool { m, _ := getMetadata(n) @@ -227,16 +225,20 @@ func TestPauseMetadata(t *testing.T) { test.Equal(t, false, isPaused(nsqd, 0, 0)) - channel.Pause() + err = channel.Pause() + test.Nil(t, err) test.Equal(t, false, isPaused(nsqd, 0, 0)) - nsqd.PersistMetadata() + err = nsqd.PersistMetadata() + test.Nil(t, err) test.Equal(t, true, isPaused(nsqd, 0, 0)) - channel.UnPause() + err = channel.UnPause() + test.Nil(t, err) test.Equal(t, true, isPaused(nsqd, 0, 0)) - nsqd.PersistMetadata() + err = nsqd.PersistMetadata() + test.Nil(t, err) test.Equal(t, false, isPaused(nsqd, 0, 0)) } @@ -273,11 +275,13 @@ func TestReconfigure(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() newOpts := NewOptions() newOpts.Logger = opts.Logger + newOpts.BroadcastTCPPort = nsqd.getOpts().BroadcastTCPPort + newOpts.BroadcastHTTPPort = nsqd.getOpts().BroadcastHTTPPort newOpts.NSQLookupdTCPAddresses = []string{lookupd1.RealTCPAddr().String()} nsqd.swapOpts(newOpts) nsqd.triggerOptsNotification() @@ -295,6 +299,8 @@ func TestReconfigure(t *testing.T) { newOpts = NewOptions() newOpts.Logger = opts.Logger + newOpts.BroadcastTCPPort = nsqd.getOpts().BroadcastTCPPort + newOpts.BroadcastHTTPPort = nsqd.getOpts().BroadcastHTTPPort newOpts.NSQLookupdTCPAddresses = []string{lookupd2.RealTCPAddr().String(), lookupd3.RealTCPAddr().String()} nsqd.swapOpts(newOpts) nsqd.triggerOptsNotification() @@ -327,7 +333,7 @@ func TestCluster(t *testing.T) { opts.NSQLookupdTCPAddresses = []string{lookupd.RealTCPAddr().String()} opts.BroadcastAddress = "127.0.0.1" _, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "cluster_test" + strconv.Itoa(int(time.Now().Unix())) @@ -453,7 +459,7 @@ func TestUnixSocketStartup(t *testing.T) { opts.Logger = test.NewTestLogger(t) _, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() test.Equal(t, isSocket(opts.TCPAddress), true) diff --git a/nsqd/options.go b/nsqd/options.go index f81ae23a8..f1814cf4f 100644 --- a/nsqd/options.go +++ b/nsqd/options.go @@ -119,7 +119,9 @@ func NewOptions() *Options { } h := md5.New() - io.WriteString(h, hostname) + if _, err := io.WriteString(h, hostname); err != nil { + log.Fatal(err) + } defaultID := int64(crc32.ChecksumIEEE(h.Sum(nil)) % 1024) return &Options{ diff --git a/nsqd/protocol_v2.go b/nsqd/protocol_v2.go index f0cdc776d..58fc82028 100644 --- a/nsqd/protocol_v2.go +++ b/nsqd/protocol_v2.go @@ -54,9 +54,13 @@ func (p *protocolV2) IOLoop(c protocol.Client) error { for { if client.HeartbeatInterval > 0 { - client.SetReadDeadline(time.Now().Add(client.HeartbeatInterval * 2)) + if err := client.SetReadDeadline(time.Now().Add(client.HeartbeatInterval * 2)); err != nil { + return err + } } else { - client.SetReadDeadline(zeroTime) + if err := client.SetReadDeadline(zeroTime); err != nil { + return err + } } // ReadSlice does not allocate new space for the data each request @@ -145,9 +149,15 @@ func (p *protocolV2) Send(client *clientV2, frameType int32, data []byte) error var zeroTime time.Time if client.HeartbeatInterval > 0 { - client.SetWriteDeadline(time.Now().Add(client.HeartbeatInterval)) + if err := client.SetWriteDeadline(time.Now().Add(client.HeartbeatInterval)); err != nil { + client.writeLock.Unlock() + return err + } } else { - client.SetWriteDeadline(zeroTime) + if err := client.SetWriteDeadline(zeroTime); err != nil { + client.writeLock.Unlock() + return err + } } _, err := protocol.SendFramedResponse(client.Writer, frameType, data) @@ -357,7 +367,10 @@ func (p *protocolV2) messagePump(client *clientV2, startedChan chan bool) { continue } msg.Attempts++ - subChannel.StartInFlightTimeout(msg, client.ID, msgTimeout) + err = subChannel.StartInFlightTimeout(msg, client.ID, msgTimeout) + if err != nil { + goto exit + } client.SendingMessage() err = p.SendMessage(client, msg) if err != nil { diff --git a/nsqd/protocol_v2_test.go b/nsqd/protocol_v2_test.go index f5a7f69b9..2dd564447 100644 --- a/nsqd/protocol_v2_test.go +++ b/nsqd/protocol_v2_test.go @@ -10,7 +10,6 @@ import ( "fmt" "io" "math" - "math/rand" "net" "net/http" "net/http/httptest" @@ -59,7 +58,11 @@ func mustConnectNSQD(tcpAddr net.Addr) (net.Conn, error) { if err != nil { return nil, err } - conn.Write(nsq.MagicV2) + _, err = conn.Write(nsq.MagicV2) + if err != nil { + _ = conn.Close() + return nil, err + } return conn, nil } @@ -131,17 +134,18 @@ func TestBasicV2(t *testing.T) { opts.Logger = test.NewTestLogger(t) opts.ClientTimeout = 60 * time.Second tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_v2" + strconv.Itoa(int(time.Now().Unix())) topic := nsqd.GetTopic(topicName) msg := NewMessage(topic.GenerateID(), []byte("test body")) - topic.PutMessage(msg) + err := topic.PutMessage(msg) + test.Nil(t, err) conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, nil, frameTypeResponse) sub(t, conn, topicName, "ch") @@ -166,7 +170,7 @@ func TestMultipleConsumerV2(t *testing.T) { opts.Logger = test.NewTestLogger(t) opts.ClientTimeout = 60 * time.Second tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_multiple_v2" + strconv.Itoa(int(time.Now().Unix())) @@ -174,12 +178,13 @@ func TestMultipleConsumerV2(t *testing.T) { msg := NewMessage(topic.GenerateID(), []byte("test body")) topic.GetChannel("ch1") topic.GetChannel("ch2") - topic.PutMessage(msg) + err := topic.PutMessage(msg) + test.Nil(t, err) for _, i := range []string{"1", "2"} { conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, nil, frameTypeResponse) sub(t, conn, topicName, "ch"+i) @@ -218,7 +223,7 @@ func TestSameZoneConsumerV2(t *testing.T) { opts.TopologyRegion = "region" opts.TopologyZone = "zone" tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_zone_v2" + strconv.Itoa(int(time.Now().Unix())) @@ -232,7 +237,7 @@ func TestSameZoneConsumerV2(t *testing.T) { zone := zone conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, map[string]interface{}{"topology_zone": zone}, frameTypeResponse) sub(t, conn, topicName, "ch") @@ -264,7 +269,8 @@ func TestSameZoneConsumerV2(t *testing.T) { // first 20 messages go to same zone (each has RDY 10) // next message goes to global memoryChan (All consumers) for i := 0; i < 21; i++ { - topic.PutMessage(NewMessage(topic.GenerateID(), make([]byte, 100))) + err := topic.PutMessage(NewMessage(topic.GenerateID(), make([]byte, 100))) + test.Nil(t, err) if i%2 == 0 { // sleep long enough for messagePump to wait again time.Sleep(time.Millisecond) @@ -291,12 +297,12 @@ func TestClientTimeout(t *testing.T) { opts.ClientTimeout = 150 * time.Millisecond opts.LogLevel = LOG_DEBUG tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, nil, frameTypeResponse) sub(t, conn, topicName, "ch") @@ -327,12 +333,12 @@ func TestClientHeartbeat(t *testing.T) { opts.Logger = test.NewTestLogger(t) opts.ClientTimeout = 200 * time.Millisecond tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, nil, frameTypeResponse) sub(t, conn, topicName, "ch") @@ -364,12 +370,12 @@ func TestClientHeartbeatDisableSUB(t *testing.T) { opts.ClientTimeout = 200 * time.Millisecond opts.LogLevel = LOG_DEBUG tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, map[string]interface{}{ "heartbeat_interval": -1, @@ -382,12 +388,12 @@ func TestClientHeartbeatDisable(t *testing.T) { opts.Logger = test.NewTestLogger(t) opts.ClientTimeout = 100 * time.Millisecond tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, map[string]interface{}{ "heartbeat_interval": -1, @@ -404,12 +410,12 @@ func TestMaxHeartbeatIntervalValid(t *testing.T) { opts.Logger = test.NewTestLogger(t) opts.MaxHeartbeatInterval = 300 * time.Second tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() hbi := int(opts.MaxHeartbeatInterval / time.Millisecond) identify(t, conn, map[string]interface{}{ @@ -422,12 +428,12 @@ func TestMaxHeartbeatIntervalInvalid(t *testing.T) { opts.Logger = test.NewTestLogger(t) opts.MaxHeartbeatInterval = 300 * time.Second tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() hbi := int(opts.MaxHeartbeatInterval/time.Millisecond + 1) data := identify(t, conn, map[string]interface{}{ @@ -442,12 +448,12 @@ func TestPausing(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, nil, frameTypeResponse) sub(t, conn, topicName, "ch") @@ -458,7 +464,8 @@ func TestPausing(t *testing.T) { topic := nsqd.GetTopic(topicName) msg := NewMessage(topic.GenerateID(), []byte("test body")) channel := topic.GetChannel("ch") - topic.PutMessage(msg) + err = topic.PutMessage(msg) + test.Nil(t, err) // receive the first message via the client, finish it, and send new RDY resp, _ := nsq.ReadResponse(conn) @@ -476,13 +483,15 @@ func TestPausing(t *testing.T) { time.Sleep(50 * time.Millisecond) // pause the channel... the client shouldn't receive any more messages - channel.Pause() + err = channel.Pause() + test.Nil(t, err) // sleep to allow the paused state to take effect time.Sleep(50 * time.Millisecond) msg = NewMessage(topic.GenerateID(), []byte("test body2")) - topic.PutMessage(msg) + err = topic.PutMessage(msg) + test.Nil(t, err) // allow the client to possibly get a message, the test would hang indefinitely // if pausing was not working @@ -491,10 +500,12 @@ func TestPausing(t *testing.T) { test.Equal(t, []byte("test body2"), msg.Body) // unpause the channel... the client should now be pushed a message - channel.UnPause() + err = channel.UnPause() + test.Nil(t, err) msg = NewMessage(topic.GenerateID(), []byte("test body3")) - topic.PutMessage(msg) + err = topic.PutMessage(msg) + test.Nil(t, err) resp, _ = nsq.ReadResponse(conn) _, data, _ = nsq.UnpackResponse(resp) @@ -506,12 +517,12 @@ func TestEmptyCommand(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() _, err = conn.Write([]byte("\n\n")) test.Nil(t, err) @@ -526,12 +537,12 @@ func TestSizeLimits(t *testing.T) { opts.MaxMsgSize = 100 opts.MaxBodySize = 1000 tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() topicName := "test_limits_v2" + strconv.Itoa(int(time.Now().Unix())) @@ -539,7 +550,8 @@ func TestSizeLimits(t *testing.T) { sub(t, conn, topicName, "ch") // PUB that's valid - nsq.Publish(topicName, make([]byte, 95)).WriteTo(conn) + _, err = nsq.Publish(topicName, make([]byte, 95)).WriteTo(conn) + test.Nil(t, err) resp, _ := nsq.ReadResponse(conn) frameType, data, _ := nsq.UnpackResponse(resp) t.Logf("frameType: %d, data: %s", frameType, data) @@ -547,7 +559,8 @@ func TestSizeLimits(t *testing.T) { test.Equal(t, []byte("OK"), data) // PUB that's invalid (too big) - nsq.Publish(topicName, make([]byte, 105)).WriteTo(conn) + _, err = nsq.Publish(topicName, make([]byte, 105)).WriteTo(conn) + test.Nil(t, err) resp, _ = nsq.ReadResponse(conn) frameType, data, _ = nsq.UnpackResponse(resp) t.Logf("frameType: %d, data: %s", frameType, data) @@ -557,10 +570,11 @@ func TestSizeLimits(t *testing.T) { // need to reconnect conn, err = mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() // PUB thats empty - nsq.Publish(topicName, []byte{}).WriteTo(conn) + _, err = nsq.Publish(topicName, []byte{}).WriteTo(conn) + test.Nil(t, err) resp, _ = nsq.ReadResponse(conn) frameType, data, _ = nsq.UnpackResponse(resp) t.Logf("frameType: %d, data: %s", frameType, data) @@ -570,7 +584,7 @@ func TestSizeLimits(t *testing.T) { // need to reconnect conn, err = mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() // MPUB body that's valid mpub := make([][]byte, 5) @@ -578,7 +592,8 @@ func TestSizeLimits(t *testing.T) { mpub[i] = make([]byte, 100) } cmd, _ := nsq.MultiPublish(topicName, mpub) - cmd.WriteTo(conn) + _, err = cmd.WriteTo(conn) + test.Nil(t, err) resp, _ = nsq.ReadResponse(conn) frameType, data, _ = nsq.UnpackResponse(resp) t.Logf("frameType: %d, data: %s", frameType, data) @@ -591,7 +606,8 @@ func TestSizeLimits(t *testing.T) { mpub[i] = make([]byte, 100) } cmd, _ = nsq.MultiPublish(topicName, mpub) - cmd.WriteTo(conn) + _, err = cmd.WriteTo(conn) + test.Nil(t, err) resp, _ = nsq.ReadResponse(conn) frameType, data, _ = nsq.UnpackResponse(resp) t.Logf("frameType: %d, data: %s", frameType, data) @@ -601,7 +617,7 @@ func TestSizeLimits(t *testing.T) { // need to reconnect conn, err = mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() // MPUB that's invalid (one message empty) mpub = make([][]byte, 5) @@ -610,7 +626,8 @@ func TestSizeLimits(t *testing.T) { } mpub = append(mpub, []byte{}) cmd, _ = nsq.MultiPublish(topicName, mpub) - cmd.WriteTo(conn) + _, err = cmd.WriteTo(conn) + test.Nil(t, err) resp, _ = nsq.ReadResponse(conn) frameType, data, _ = nsq.UnpackResponse(resp) t.Logf("frameType: %d, data: %s", frameType, data) @@ -620,7 +637,7 @@ func TestSizeLimits(t *testing.T) { // need to reconnect conn, err = mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() // MPUB body that's invalid (one of the messages is too big) mpub = make([][]byte, 5) @@ -628,7 +645,8 @@ func TestSizeLimits(t *testing.T) { mpub[i] = make([]byte, 101) } cmd, _ = nsq.MultiPublish(topicName, mpub) - cmd.WriteTo(conn) + _, err = cmd.WriteTo(conn) + test.Nil(t, err) resp, _ = nsq.ReadResponse(conn) frameType, data, _ = nsq.UnpackResponse(resp) t.Logf("frameType: %d, data: %s", frameType, data) @@ -641,12 +659,12 @@ func TestDPUB(t *testing.T) { opts.Logger = test.NewTestLogger(t) opts.LogLevel = LOG_DEBUG tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() topicName := "test_dpub_v2" + strconv.Itoa(int(time.Now().Unix())) @@ -654,7 +672,8 @@ func TestDPUB(t *testing.T) { sub(t, conn, topicName, "ch") // valid - nsq.DeferredPublish(topicName, time.Second, make([]byte, 100)).WriteTo(conn) + _, err = nsq.DeferredPublish(topicName, time.Second, make([]byte, 100)).WriteTo(conn) + test.Nil(t, err) resp, _ := nsq.ReadResponse(conn) frameType, data, _ := nsq.UnpackResponse(resp) t.Logf("frameType: %d, data: %s", frameType, data) @@ -671,7 +690,8 @@ func TestDPUB(t *testing.T) { test.Equal(t, 1, int(atomic.LoadUint64(&ch.messageCount))) // duration out of range - nsq.DeferredPublish(topicName, opts.MaxDeferTimeout+100*time.Millisecond, make([]byte, 100)).WriteTo(conn) + _, err = nsq.DeferredPublish(topicName, opts.MaxDeferTimeout+100*time.Millisecond, make([]byte, 100)).WriteTo(conn) + test.Nil(t, err) resp, _ = nsq.ReadResponse(conn) frameType, data, _ = nsq.UnpackResponse(resp) t.Logf("frameType: %d, data: %s", frameType, data) @@ -685,14 +705,14 @@ func TestTouch(t *testing.T) { opts.LogLevel = LOG_DEBUG opts.MsgTimeout = 150 * time.Millisecond tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_touch" + strconv.Itoa(int(time.Now().Unix())) conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, nil, frameTypeResponse) sub(t, conn, topicName, "ch") @@ -700,7 +720,8 @@ func TestTouch(t *testing.T) { topic := nsqd.GetTopic(topicName) channel := topic.GetChannel("ch") msg := NewMessage(topic.GenerateID(), []byte("test body")) - topic.PutMessage(msg) + err = topic.PutMessage(msg) + test.Nil(t, err) _, err = nsq.Ready(1).WriteTo(conn) test.Nil(t, err) @@ -731,18 +752,19 @@ func TestMaxRdyCount(t *testing.T) { opts.LogLevel = LOG_DEBUG opts.MaxRdyCount = 50 tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_max_rdy_count" + strconv.Itoa(int(time.Now().Unix())) conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() topic := nsqd.GetTopic(topicName) msg := NewMessage(topic.GenerateID(), []byte("test body")) - topic.PutMessage(msg) + err = topic.PutMessage(msg) + test.Nil(t, err) data := identify(t, conn, nil, frameTypeResponse) r := struct { @@ -777,12 +799,12 @@ func TestFatalError(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() _, err = conn.Write([]byte("ASDF\n")) test.Nil(t, err) @@ -804,21 +826,22 @@ func TestOutputBuffering(t *testing.T) { opts.MaxOutputBufferSize = 512 * 1024 opts.MaxOutputBufferTimeout = time.Second tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_output_buffering" + strconv.Itoa(int(time.Now().Unix())) conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() outputBufferSize := 256 * 1024 outputBufferTimeout := 500 topic := nsqd.GetTopic(topicName) msg := NewMessage(topic.GenerateID(), make([]byte, outputBufferSize-1024)) - topic.PutMessage(msg) + err = topic.PutMessage(msg) + test.Nil(t, err) start := time.Now() data := identify(t, conn, map[string]interface{}{ @@ -826,7 +849,8 @@ func TestOutputBuffering(t *testing.T) { "output_buffer_timeout": outputBufferTimeout, }, frameTypeResponse) var decoded map[string]interface{} - json.Unmarshal(data, &decoded) + err = json.Unmarshal(data, &decoded) + test.Nil(t, err) v, ok := decoded["output_buffer_size"] test.Equal(t, true, ok) test.Equal(t, outputBufferSize, int(v.(float64))) @@ -856,12 +880,12 @@ func TestOutputBufferingValidity(t *testing.T) { opts.MaxOutputBufferSize = 512 * 1024 opts.MaxOutputBufferTimeout = time.Second tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, map[string]interface{}{ "output_buffer_size": 512 * 1024, @@ -883,7 +907,7 @@ func TestOutputBufferingValidity(t *testing.T) { conn, err = mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data = identify(t, conn, map[string]interface{}{ "output_buffer_size": 0, @@ -899,12 +923,12 @@ func TestTLS(t *testing.T) { opts.TLSCert = "./test/certs/server.pem" opts.TLSKey = "./test/certs/server.key" tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data := identify(t, conn, map[string]interface{}{ "tls_v1": true, @@ -940,20 +964,20 @@ func TestTLSRequired(t *testing.T) { opts.TLSRequired = TLSRequiredExceptHTTP tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_tls_required" + strconv.Itoa(int(time.Now().Unix())) conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() subFail(t, conn, topicName, "ch") conn, err = mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data := identify(t, conn, map[string]interface{}{ "tls_v1": true, @@ -989,13 +1013,13 @@ func TestTLSAuthRequire(t *testing.T) { opts.TLSClientAuthPolicy = "require" tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() // No Certs conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data := identify(t, conn, map[string]interface{}{ "tls_v1": true, @@ -1016,7 +1040,7 @@ func TestTLSAuthRequire(t *testing.T) { // With Unsigned Cert conn, err = mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data = identify(t, conn, map[string]interface{}{ "tls_v1": true, @@ -1056,13 +1080,13 @@ func TestTLSAuthRequireVerify(t *testing.T) { opts.TLSClientAuthPolicy = "require-verify" tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() // with no cert conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data := identify(t, conn, map[string]interface{}{ "tls_v1": true, @@ -1083,7 +1107,7 @@ func TestTLSAuthRequireVerify(t *testing.T) { // with invalid cert conn, err = mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data = identify(t, conn, map[string]interface{}{ "tls_v1": true, @@ -1107,7 +1131,7 @@ func TestTLSAuthRequireVerify(t *testing.T) { // with valid cert conn, err = mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data = identify(t, conn, map[string]interface{}{ "tls_v1": true, @@ -1141,12 +1165,12 @@ func TestDeflate(t *testing.T) { opts.LogLevel = LOG_DEBUG opts.DeflateEnabled = true tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data := identify(t, conn, map[string]interface{}{ "deflate": true, @@ -1171,18 +1195,32 @@ type readWriter struct { io.Writer } +// Write flushes after each write so that buffered compression writers +// (e.g. snappy.NewBufferedWriter) send data to the connection immediately, +// which the request/response flow in these tests relies on. +func (rw readWriter) Write(p []byte) (int, error) { + n, err := rw.Writer.Write(p) + if err != nil { + return n, err + } + if f, ok := rw.Writer.(interface{ Flush() error }); ok { + err = f.Flush() + } + return n, err +} + func TestSnappy(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) opts.LogLevel = LOG_DEBUG opts.SnappyEnabled = true tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data := identify(t, conn, map[string]interface{}{ "snappy": true, @@ -1202,8 +1240,7 @@ func TestSnappy(t *testing.T) { test.Equal(t, []byte("OK"), data) msgBody := make([]byte, 128000) - //lint:ignore SA1019 NewWriter is deprecated by NewBufferedWriter, but we don't want to buffer - w := snappy.NewWriter(conn) + w := snappy.NewBufferedWriter(conn) rw := readWriter{compressConn, w} @@ -1215,7 +1252,8 @@ func TestSnappy(t *testing.T) { topic := nsqd.GetTopic(topicName) msg := NewMessage(topic.GenerateID(), msgBody) - topic.PutMessage(msg) + err = topic.PutMessage(msg) + test.Nil(t, err) resp, _ = nsq.ReadResponse(compressConn) frameType, data, _ = nsq.UnpackResponse(resp) @@ -1233,12 +1271,12 @@ func TestTLSDeflate(t *testing.T) { opts.TLSCert = "./test/certs/cert.pem" opts.TLSKey = "./test/certs/key.pem" tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data := identify(t, conn, map[string]interface{}{ "tls_v1": true, @@ -1277,8 +1315,6 @@ func TestTLSDeflate(t *testing.T) { } func TestSampling(t *testing.T) { - rand.Seed(time.Now().UTC().UnixNano()) - num := 10000 sampleRate := 42 slack := 5 @@ -1288,12 +1324,12 @@ func TestSampling(t *testing.T) { opts.LogLevel = LOG_DEBUG opts.MaxRdyCount = int64(num) tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data := identify(t, conn, map[string]interface{}{ "sample_rate": int32(sampleRate), @@ -1309,7 +1345,8 @@ func TestSampling(t *testing.T) { topic := nsqd.GetTopic(topicName) for i := 0; i < num; i++ { msg := NewMessage(topic.GenerateID(), []byte("test body")) - topic.PutMessage(msg) + err = topic.PutMessage(msg) + test.Nil(t, err) } channel := topic.GetChannel("ch") @@ -1357,12 +1394,12 @@ func TestTLSSnappy(t *testing.T) { opts.TLSCert = "./test/certs/cert.pem" opts.TLSKey = "./test/certs/key.pem" tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data := identify(t, conn, map[string]interface{}{ "tls_v1": true, @@ -1406,23 +1443,25 @@ func TestClientMsgTimeout(t *testing.T) { opts.LogLevel = LOG_DEBUG opts.QueueScanRefreshInterval = 100 * time.Millisecond tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_cmsg_timeout" + strconv.Itoa(int(time.Now().Unix())) topic := nsqd.GetTopic(topicName) ch := topic.GetChannel("ch") msg := NewMessage(topic.GenerateID(), make([]byte, 100)) - topic.PutMessage(msg) + err := topic.PutMessage(msg) + test.Nil(t, err) // without this the race detector thinks there's a write // to msg.Attempts that races with the read in the protocol's messagePump... // it does not reflect a realistically possible condition - topic.PutMessage(NewMessage(topic.GenerateID(), make([]byte, 100))) + err = topic.PutMessage(NewMessage(topic.GenerateID(), make([]byte, 100))) + test.Nil(t, err) conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, map[string]interface{}{ "msg_timeout": 1000, @@ -1464,12 +1503,12 @@ func TestBadFin(t *testing.T) { opts.Logger = test.NewTestLogger(t) opts.LogLevel = LOG_DEBUG tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, map[string]interface{}{}, frameTypeResponse) sub(t, conn, "test_fin", "ch") @@ -1491,14 +1530,14 @@ func TestReqTimeoutRange(t *testing.T) { opts.LogLevel = LOG_DEBUG opts.MaxReqTimeout = 1 * time.Minute tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_req" + strconv.Itoa(int(time.Now().Unix())) conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, nil, frameTypeResponse) sub(t, conn, topicName, "ch") @@ -1506,7 +1545,8 @@ func TestReqTimeoutRange(t *testing.T) { topic := nsqd.GetTopic(topicName) channel := topic.GetChannel("ch") msg := NewMessage(topic.GenerateID(), []byte("test body")) - topic.PutMessage(msg) + err = topic.PutMessage(msg) + test.Nil(t, err) _, err = nsq.Ready(1).WriteTo(conn) test.Nil(t, err) @@ -1595,14 +1635,16 @@ func runAuthTest(t *testing.T, authResponse string, authSecret string, authError t.Error(err) } } else { - r.ParseForm() + err = r.ParseForm() + test.Nil(t, err) values = r.Form } test.Equal(t, expectedRemoteIP, values.Get("remote_ip")) test.Equal(t, expectedTLS, values.Get("tls")) test.Equal(t, commonName, values.Get("common_name")) test.Equal(t, authSecret, values.Get("secret")) - fmt.Fprint(w, authResponse) + _, err = fmt.Fprint(w, authResponse) + test.Nil(t, err) })) defer authd.Close() @@ -1620,12 +1662,12 @@ func runAuthTest(t *testing.T, authResponse string, authSecret string, authError opts.TLSClientAuthPolicy = "require" } tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data := identify(t, conn, map[string]interface{}{ "tls_v1": tlsEnabled, @@ -1719,7 +1761,7 @@ func BenchmarkProtocolV2Exec(b *testing.B) { b.StartTimer() for i := 0; i < b.N; i++ { - p.Exec(c, params) + _, _ = p.Exec(c, params) } } @@ -1732,7 +1774,7 @@ func benchmarkProtocolV2PubMultiTopic(b *testing.B, numTopics int) { opts.Logger = test.NewTestLogger(b) opts.MemQueueSize = int64(b.N) tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() msg := make([]byte, size) batch := make([][]byte, batchSize) for i := range batch { @@ -1806,7 +1848,7 @@ func benchmarkProtocolV2Pub(b *testing.B, size int) { opts.Logger = test.NewTestLogger(b) opts.MemQueueSize = int64(b.N) tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() msg := make([]byte, size) batch := make([][]byte, batchSize) for i := range batch { @@ -1886,13 +1928,16 @@ func benchmarkProtocolV2Sub(b *testing.B, size int) { opts.Logger = test.NewTestLogger(b) opts.MemQueueSize = int64(b.N) tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() msg := make([]byte, size) topicName := "bench_v2_sub" + strconv.Itoa(b.N) + strconv.Itoa(int(time.Now().Unix())) topic := nsqd.GetTopic(topicName) for i := 0; i < b.N; i++ { msg := NewMessage(topic.GenerateID(), msg) - topic.PutMessage(msg) + err := topic.PutMessage(msg) + if err != nil { + panic(err.Error()) + } } topic.GetChannel("ch") b.SetBytes(int64(len(msg))) @@ -1929,8 +1974,14 @@ func subWorker(n int, workers int, tcpAddr net.Addr, topicName string, rdyChan c rdyCount := int(math.Min(math.Max(float64(n/workers), 1), 2500)) rdyChan <- 1 <-goChan - nsq.Ready(rdyCount).WriteTo(rw) - rw.Flush() + _, err = nsq.Ready(rdyCount).WriteTo(rw) + if err != nil { + panic(err.Error()) + } + err = rw.Flush() + if err != nil { + panic(err.Error()) + } num := n / workers for i := 0; i < num; i++ { resp, err := nsq.ReadResponse(rw) @@ -1948,12 +1999,18 @@ func subWorker(n int, workers int, tcpAddr net.Addr, topicName string, rdyChan c if err != nil { panic(err.Error()) } - nsq.Finish(nsq.MessageID(msg.ID)).WriteTo(rw) + _, err = nsq.Finish(nsq.MessageID(msg.ID)).WriteTo(rw) + if err != nil { + panic(err.Error()) + } if (i+1)%rdyCount == 0 || i+1 == num { if i+1 == num { - nsq.Ready(0).WriteTo(conn) + _, _ = nsq.Ready(0).WriteTo(conn) + } + err = rw.Flush() + if err != nil { + panic(err.Error()) } - rw.Flush() } } } @@ -1980,7 +2037,7 @@ func benchmarkProtocolV2MultiSub(b *testing.B, num int) { opts.Logger = test.NewTestLogger(b) opts.MemQueueSize = int64(b.N) tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() msg := make([]byte, 256) b.SetBytes(int64(len(msg) * num)) @@ -1992,7 +2049,10 @@ func benchmarkProtocolV2MultiSub(b *testing.B, num int) { topic := nsqd.GetTopic(topicName) for i := 0; i < b.N; i++ { msg := NewMessage(topic.GenerateID(), msg) - topic.PutMessage(msg) + err := topic.PutMessage(msg) + if err != nil { + panic(err.Error()) + } } topic.GetChannel("ch") diff --git a/nsqd/protocol_v2_unixsocket_test.go b/nsqd/protocol_v2_unixsocket_test.go index fa5af1fe9..85b805fbc 100644 --- a/nsqd/protocol_v2_unixsocket_test.go +++ b/nsqd/protocol_v2_unixsocket_test.go @@ -1,5 +1,7 @@ package nsqd +//nolint:errcheck + import ( "bufio" "bytes" @@ -56,7 +58,11 @@ func mustUnixSocketConnectNSQD(addr net.Addr) (net.Conn, error) { if err != nil { return nil, err } - conn.Write(nsq.MagicV2) + _, err = conn.Write(nsq.MagicV2) + if err != nil { + _ = conn.Close() + return nil, err + } return conn, nil } @@ -66,17 +72,18 @@ func TestUnixSocketBasicV2(t *testing.T) { opts.Logger = test.NewTestLogger(t) opts.ClientTimeout = 60 * time.Second addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_v2" + strconv.Itoa(int(time.Now().Unix())) topic := nsqd.GetTopic(topicName) msg := NewMessage(topic.GenerateID(), []byte("test body")) - topic.PutMessage(msg) + err := topic.PutMessage(msg) + test.Nil(t, err) conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, nil, frameTypeResponse) sub(t, conn, topicName, "ch") @@ -101,7 +108,7 @@ func TestUnixSocketMultipleConsumerV2(t *testing.T) { opts.Logger = test.NewTestLogger(t) opts.ClientTimeout = 60 * time.Second addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_multiple_v2" + strconv.Itoa(int(time.Now().Unix())) @@ -109,12 +116,13 @@ func TestUnixSocketMultipleConsumerV2(t *testing.T) { msg := NewMessage(topic.GenerateID(), []byte("test body")) topic.GetChannel("ch1") topic.GetChannel("ch2") - topic.PutMessage(msg) + err := topic.PutMessage(msg) + test.Nil(t, err) for _, i := range []string{"1", "2"} { conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, nil, frameTypeResponse) sub(t, conn, topicName, "ch"+i) @@ -151,12 +159,12 @@ func TestUnixSocketClientTimeout(t *testing.T) { opts.ClientTimeout = 150 * time.Millisecond opts.LogLevel = LOG_DEBUG addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, nil, frameTypeResponse) sub(t, conn, topicName, "ch") @@ -187,12 +195,12 @@ func TestUnixSocketClientHeartbeat(t *testing.T) { opts.Logger = test.NewTestLogger(t) opts.ClientTimeout = 200 * time.Millisecond addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, nil, frameTypeResponse) sub(t, conn, topicName, "ch") @@ -224,12 +232,12 @@ func TestUnixSocketClientHeartbeatDisableSUB(t *testing.T) { opts.ClientTimeout = 200 * time.Millisecond opts.LogLevel = LOG_DEBUG addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, map[string]interface{}{ "heartbeat_interval": -1, @@ -242,12 +250,12 @@ func TestUnixSocketClientHeartbeatDisable(t *testing.T) { opts.Logger = test.NewTestLogger(t) opts.ClientTimeout = 100 * time.Millisecond addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, map[string]interface{}{ "heartbeat_interval": -1, @@ -264,12 +272,12 @@ func TestUnixSocketMaxHeartbeatIntervalValid(t *testing.T) { opts.Logger = test.NewTestLogger(t) opts.MaxHeartbeatInterval = 300 * time.Second addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() hbi := int(opts.MaxHeartbeatInterval / time.Millisecond) identify(t, conn, map[string]interface{}{ @@ -282,12 +290,12 @@ func TestUnixSocketMaxHeartbeatIntervalInvalid(t *testing.T) { opts.Logger = test.NewTestLogger(t) opts.MaxHeartbeatInterval = 300 * time.Second addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() hbi := int(opts.MaxHeartbeatInterval/time.Millisecond + 1) data := identify(t, conn, map[string]interface{}{ @@ -302,12 +310,12 @@ func TestUnixSocketPausing(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, nil, frameTypeResponse) sub(t, conn, topicName, "ch") @@ -318,7 +326,8 @@ func TestUnixSocketPausing(t *testing.T) { topic := nsqd.GetTopic(topicName) msg := NewMessage(topic.GenerateID(), []byte("test body")) channel := topic.GetChannel("ch") - topic.PutMessage(msg) + err = topic.PutMessage(msg) + test.Nil(t, err) // receive the first message via the client, finish it, and send new RDY resp, _ := nsq.ReadResponse(conn) @@ -336,13 +345,15 @@ func TestUnixSocketPausing(t *testing.T) { time.Sleep(50 * time.Millisecond) // pause the channel... the client shouldn't receive any more messages - channel.Pause() + err = channel.Pause() + test.Nil(t, err) // sleep to allow the paused state to take effect time.Sleep(50 * time.Millisecond) msg = NewMessage(topic.GenerateID(), []byte("test body2")) - topic.PutMessage(msg) + err = topic.PutMessage(msg) + test.Nil(t, err) // allow the client to possibly get a message, the test would hang indefinitely // if pausing was not working @@ -351,10 +362,12 @@ func TestUnixSocketPausing(t *testing.T) { test.Equal(t, []byte("test body2"), msg.Body) // unpause the channel... the client should now be pushed a message - channel.UnPause() + err = channel.UnPause() + test.Nil(t, err) msg = NewMessage(topic.GenerateID(), []byte("test body3")) - topic.PutMessage(msg) + err = topic.PutMessage(msg) + test.Nil(t, err) resp, _ = nsq.ReadResponse(conn) _, data, _ = nsq.UnpackResponse(resp) @@ -366,12 +379,12 @@ func TestUnixSocketEmptyCommand(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() _, err = conn.Write([]byte("\n\n")) test.Nil(t, err) @@ -386,12 +399,12 @@ func TestUnixSocketSizeLimits(t *testing.T) { opts.MaxMsgSize = 100 opts.MaxBodySize = 1000 addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() topicName := "test_limits_v2" + strconv.Itoa(int(time.Now().Unix())) @@ -399,7 +412,8 @@ func TestUnixSocketSizeLimits(t *testing.T) { sub(t, conn, topicName, "ch") // PUB that's valid - nsq.Publish(topicName, make([]byte, 95)).WriteTo(conn) + _, err = nsq.Publish(topicName, make([]byte, 95)).WriteTo(conn) + test.Nil(t, err) resp, _ := nsq.ReadResponse(conn) frameType, data, _ := nsq.UnpackResponse(resp) t.Logf("frameType: %d, data: %s", frameType, data) @@ -407,7 +421,8 @@ func TestUnixSocketSizeLimits(t *testing.T) { test.Equal(t, []byte("OK"), data) // PUB that's invalid (too big) - nsq.Publish(topicName, make([]byte, 105)).WriteTo(conn) + _, err = nsq.Publish(topicName, make([]byte, 105)).WriteTo(conn) + test.Nil(t, err) resp, _ = nsq.ReadResponse(conn) frameType, data, _ = nsq.UnpackResponse(resp) t.Logf("frameType: %d, data: %s", frameType, data) @@ -417,10 +432,11 @@ func TestUnixSocketSizeLimits(t *testing.T) { // need to reconnect conn, err = mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() // PUB thats empty - nsq.Publish(topicName, []byte{}).WriteTo(conn) + _, err = nsq.Publish(topicName, []byte{}).WriteTo(conn) + test.Nil(t, err) resp, _ = nsq.ReadResponse(conn) frameType, data, _ = nsq.UnpackResponse(resp) t.Logf("frameType: %d, data: %s", frameType, data) @@ -430,7 +446,7 @@ func TestUnixSocketSizeLimits(t *testing.T) { // need to reconnect conn, err = mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() // MPUB body that's valid mpub := make([][]byte, 5) @@ -438,7 +454,8 @@ func TestUnixSocketSizeLimits(t *testing.T) { mpub[i] = make([]byte, 100) } cmd, _ := nsq.MultiPublish(topicName, mpub) - cmd.WriteTo(conn) + _, err = cmd.WriteTo(conn) + test.Nil(t, err) resp, _ = nsq.ReadResponse(conn) frameType, data, _ = nsq.UnpackResponse(resp) t.Logf("frameType: %d, data: %s", frameType, data) @@ -451,7 +468,8 @@ func TestUnixSocketSizeLimits(t *testing.T) { mpub[i] = make([]byte, 100) } cmd, _ = nsq.MultiPublish(topicName, mpub) - cmd.WriteTo(conn) + _, err = cmd.WriteTo(conn) + test.Nil(t, err) resp, _ = nsq.ReadResponse(conn) frameType, data, _ = nsq.UnpackResponse(resp) t.Logf("frameType: %d, data: %s", frameType, data) @@ -461,7 +479,7 @@ func TestUnixSocketSizeLimits(t *testing.T) { // need to reconnect conn, err = mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() // MPUB that's invalid (one message empty) mpub = make([][]byte, 5) @@ -470,7 +488,8 @@ func TestUnixSocketSizeLimits(t *testing.T) { } mpub = append(mpub, []byte{}) cmd, _ = nsq.MultiPublish(topicName, mpub) - cmd.WriteTo(conn) + _, err = cmd.WriteTo(conn) + test.Nil(t, err) resp, _ = nsq.ReadResponse(conn) frameType, data, _ = nsq.UnpackResponse(resp) t.Logf("frameType: %d, data: %s", frameType, data) @@ -480,7 +499,7 @@ func TestUnixSocketSizeLimits(t *testing.T) { // need to reconnect conn, err = mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() // MPUB body that's invalid (one of the messages is too big) mpub = make([][]byte, 5) @@ -488,7 +507,8 @@ func TestUnixSocketSizeLimits(t *testing.T) { mpub[i] = make([]byte, 101) } cmd, _ = nsq.MultiPublish(topicName, mpub) - cmd.WriteTo(conn) + _, err = cmd.WriteTo(conn) + test.Nil(t, err) resp, _ = nsq.ReadResponse(conn) frameType, data, _ = nsq.UnpackResponse(resp) t.Logf("frameType: %d, data: %s", frameType, data) @@ -501,12 +521,12 @@ func TestUnixSocketDPUB(t *testing.T) { opts.Logger = test.NewTestLogger(t) opts.LogLevel = LOG_DEBUG addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() topicName := "test_dpub_v2" + strconv.Itoa(int(time.Now().Unix())) @@ -514,7 +534,8 @@ func TestUnixSocketDPUB(t *testing.T) { sub(t, conn, topicName, "ch") // valid - nsq.DeferredPublish(topicName, time.Second, make([]byte, 100)).WriteTo(conn) + _, err = nsq.DeferredPublish(topicName, time.Second, make([]byte, 100)).WriteTo(conn) + test.Nil(t, err) resp, _ := nsq.ReadResponse(conn) frameType, data, _ := nsq.UnpackResponse(resp) t.Logf("frameType: %d, data: %s", frameType, data) @@ -531,7 +552,8 @@ func TestUnixSocketDPUB(t *testing.T) { test.Equal(t, 1, int(atomic.LoadUint64(&ch.messageCount))) // duration out of range - nsq.DeferredPublish(topicName, opts.MaxDeferTimeout+100*time.Millisecond, make([]byte, 100)).WriteTo(conn) + _, err = nsq.DeferredPublish(topicName, opts.MaxDeferTimeout+100*time.Millisecond, make([]byte, 100)).WriteTo(conn) + test.Nil(t, err) resp, _ = nsq.ReadResponse(conn) frameType, data, _ = nsq.UnpackResponse(resp) t.Logf("frameType: %d, data: %s", frameType, data) @@ -545,14 +567,14 @@ func TestUnixSocketTouch(t *testing.T) { opts.LogLevel = LOG_DEBUG opts.MsgTimeout = 150 * time.Millisecond addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_touch" + strconv.Itoa(int(time.Now().Unix())) conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, nil, frameTypeResponse) sub(t, conn, topicName, "ch") @@ -560,7 +582,8 @@ func TestUnixSocketTouch(t *testing.T) { topic := nsqd.GetTopic(topicName) channel := topic.GetChannel("ch") msg := NewMessage(topic.GenerateID(), []byte("test body")) - topic.PutMessage(msg) + err = topic.PutMessage(msg) + test.Nil(t, err) _, err = nsq.Ready(1).WriteTo(conn) test.Nil(t, err) @@ -591,18 +614,19 @@ func TestUnixSocketMaxRdyCount(t *testing.T) { opts.LogLevel = LOG_DEBUG opts.MaxRdyCount = 50 addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_max_rdy_count" + strconv.Itoa(int(time.Now().Unix())) conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() topic := nsqd.GetTopic(topicName) msg := NewMessage(topic.GenerateID(), []byte("test body")) - topic.PutMessage(msg) + err = topic.PutMessage(msg) + test.Nil(t, err) data := identify(t, conn, nil, frameTypeResponse) r := struct { @@ -637,12 +661,12 @@ func TestUnixSocketFatalError(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() _, err = conn.Write([]byte("ASDF\n")) test.Nil(t, err) @@ -664,21 +688,22 @@ func TestUnixSocketOutputBuffering(t *testing.T) { opts.MaxOutputBufferSize = 512 * 1024 opts.MaxOutputBufferTimeout = time.Second addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_output_buffering" + strconv.Itoa(int(time.Now().Unix())) conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() outputBufferSize := 256 * 1024 outputBufferTimeout := 500 topic := nsqd.GetTopic(topicName) msg := NewMessage(topic.GenerateID(), make([]byte, outputBufferSize-1024)) - topic.PutMessage(msg) + err = topic.PutMessage(msg) + test.Nil(t, err) start := time.Now() data := identify(t, conn, map[string]interface{}{ @@ -686,7 +711,8 @@ func TestUnixSocketOutputBuffering(t *testing.T) { "output_buffer_timeout": outputBufferTimeout, }, frameTypeResponse) var decoded map[string]interface{} - json.Unmarshal(data, &decoded) + err = json.Unmarshal(data, &decoded) + test.Nil(t, err) v, ok := decoded["output_buffer_size"] test.Equal(t, true, ok) test.Equal(t, outputBufferSize, int(v.(float64))) @@ -716,12 +742,12 @@ func TestUnixSocketOutputBufferingValidity(t *testing.T) { opts.MaxOutputBufferSize = 512 * 1024 opts.MaxOutputBufferTimeout = time.Second addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, map[string]interface{}{ "output_buffer_size": 512 * 1024, @@ -743,7 +769,7 @@ func TestUnixSocketOutputBufferingValidity(t *testing.T) { conn, err = mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data = identify(t, conn, map[string]interface{}{ "output_buffer_size": 0, @@ -759,12 +785,12 @@ func TestUnixSocketTLS(t *testing.T) { opts.TLSCert = "./test/certs/server.pem" opts.TLSKey = "./test/certs/server.key" addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data := identify(t, conn, map[string]interface{}{ "tls_v1": true, @@ -800,20 +826,20 @@ func TestUnixSocketTLSRequired(t *testing.T) { opts.TLSRequired = TLSRequiredExceptHTTP addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_tls_required" + strconv.Itoa(int(time.Now().Unix())) conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() subFail(t, conn, topicName, "ch") conn, err = mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data := identify(t, conn, map[string]interface{}{ "tls_v1": true, @@ -849,13 +875,13 @@ func TestUnixSocketTLSAuthRequire(t *testing.T) { opts.TLSClientAuthPolicy = "require" addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() // No Certs conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data := identify(t, conn, map[string]interface{}{ "tls_v1": true, @@ -876,7 +902,7 @@ func TestUnixSocketTLSAuthRequire(t *testing.T) { // With Unsigned Cert conn, err = mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data = identify(t, conn, map[string]interface{}{ "tls_v1": true, @@ -916,13 +942,13 @@ func TestUnixSocketTLSAuthRequireVerify(t *testing.T) { opts.TLSClientAuthPolicy = "require-verify" addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() // with no cert conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data := identify(t, conn, map[string]interface{}{ "tls_v1": true, @@ -943,7 +969,7 @@ func TestUnixSocketTLSAuthRequireVerify(t *testing.T) { // with invalid cert conn, err = mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data = identify(t, conn, map[string]interface{}{ "tls_v1": true, @@ -967,7 +993,7 @@ func TestUnixSocketTLSAuthRequireVerify(t *testing.T) { // with valid cert conn, err = mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data = identify(t, conn, map[string]interface{}{ "tls_v1": true, @@ -1001,12 +1027,12 @@ func TestUnixSocketDeflate(t *testing.T) { opts.LogLevel = LOG_DEBUG opts.DeflateEnabled = true addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data := identify(t, conn, map[string]interface{}{ "deflate": true, @@ -1032,12 +1058,12 @@ func TestUnixSocketSnappy(t *testing.T) { opts.LogLevel = LOG_DEBUG opts.SnappyEnabled = true addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data := identify(t, conn, map[string]interface{}{ "snappy": true, @@ -1057,8 +1083,7 @@ func TestUnixSocketSnappy(t *testing.T) { test.Equal(t, []byte("OK"), data) msgBody := make([]byte, 128000) - //lint:ignore SA1019 NewWriter is deprecated by NewBufferedWriter, but we don't want to buffer - w := snappy.NewWriter(conn) + w := snappy.NewBufferedWriter(conn) rw := readWriter{compressConn, w} @@ -1070,7 +1095,7 @@ func TestUnixSocketSnappy(t *testing.T) { topic := nsqd.GetTopic(topicName) msg := NewMessage(topic.GenerateID(), msgBody) - topic.PutMessage(msg) + _ = topic.PutMessage(msg) resp, _ = nsq.ReadResponse(compressConn) frameType, data, _ = nsq.UnpackResponse(resp) @@ -1088,12 +1113,12 @@ func TestUnixSocketTLSDeflate(t *testing.T) { opts.TLSCert = "./test/certs/cert.pem" opts.TLSKey = "./test/certs/key.pem" addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data := identify(t, conn, map[string]interface{}{ "tls_v1": true, @@ -1132,8 +1157,6 @@ func TestUnixSocketTLSDeflate(t *testing.T) { } func TestUnixSocketSampling(t *testing.T) { - rand.Seed(time.Now().UTC().UnixNano()) - num := 10000 sampleRate := 42 slack := 5 @@ -1143,12 +1166,12 @@ func TestUnixSocketSampling(t *testing.T) { opts.LogLevel = LOG_DEBUG opts.MaxRdyCount = int64(num) addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data := identify(t, conn, map[string]interface{}{ "sample_rate": int32(sampleRate), @@ -1164,7 +1187,7 @@ func TestUnixSocketSampling(t *testing.T) { topic := nsqd.GetTopic(topicName) for i := 0; i < num; i++ { msg := NewMessage(topic.GenerateID(), []byte("test body")) - topic.PutMessage(msg) + _ = topic.PutMessage(msg) } channel := topic.GetChannel("ch") @@ -1212,12 +1235,12 @@ func TestUnixSocketTLSSnappy(t *testing.T) { opts.TLSCert = "./test/certs/cert.pem" opts.TLSKey = "./test/certs/key.pem" addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data := identify(t, conn, map[string]interface{}{ "tls_v1": true, @@ -1261,23 +1284,23 @@ func TestUnixSocketClientMsgTimeout(t *testing.T) { opts.LogLevel = LOG_DEBUG opts.QueueScanRefreshInterval = 100 * time.Millisecond addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_cmsg_timeout" + strconv.Itoa(int(time.Now().Unix())) topic := nsqd.GetTopic(topicName) ch := topic.GetChannel("ch") msg := NewMessage(topic.GenerateID(), make([]byte, 100)) - topic.PutMessage(msg) + _ = topic.PutMessage(msg) // without this the race detector thinks there's a write // to msg.Attempts that races with the read in the protocol's messagePump... // it does not reflect a realistically possible condition - topic.PutMessage(NewMessage(topic.GenerateID(), make([]byte, 100))) + _ = topic.PutMessage(NewMessage(topic.GenerateID(), make([]byte, 100))) conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, map[string]interface{}{ "msg_timeout": 1000, @@ -1319,12 +1342,12 @@ func TestUnixSocketBadFin(t *testing.T) { opts.Logger = test.NewTestLogger(t) opts.LogLevel = LOG_DEBUG addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, map[string]interface{}{}, frameTypeResponse) sub(t, conn, "test_fin", "ch") @@ -1346,14 +1369,14 @@ func TestUnixSocketReqTimeoutRange(t *testing.T) { opts.LogLevel = LOG_DEBUG opts.MaxReqTimeout = 1 * time.Minute addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_req" + strconv.Itoa(int(time.Now().Unix())) conn, err := mustUnixSocketConnectNSQD(addr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, nil, frameTypeResponse) sub(t, conn, topicName, "ch") @@ -1361,7 +1384,7 @@ func TestUnixSocketReqTimeoutRange(t *testing.T) { topic := nsqd.GetTopic(topicName) channel := topic.GetChannel("ch") msg := NewMessage(topic.GenerateID(), []byte("test body")) - topic.PutMessage(msg) + _ = topic.PutMessage(msg) _, err = nsq.Ready(1).WriteTo(conn) test.Nil(t, err) @@ -1450,7 +1473,7 @@ func BenchmarkUnixSocketProtocolV2Exec(b *testing.B) { b.StartTimer() for i := 0; i < b.N; i++ { - p.Exec(c, params) + _, _ = p.Exec(c, params) } } @@ -1463,7 +1486,7 @@ func benchmarkUnixSocketProtocolV2PubMultiTopic(b *testing.B, numTopics int) { opts.Logger = test.NewTestLogger(b) opts.MemQueueSize = int64(b.N) addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() msg := make([]byte, size) batch := make([][]byte, batchSize) for i := range batch { @@ -1549,7 +1572,7 @@ func benchmarkUnixSocketProtocolV2Pub(b *testing.B, size int) { opts.Logger = test.NewTestLogger(b) opts.MemQueueSize = int64(b.N) addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() msg := make([]byte, size) batch := make([][]byte, batchSize) for i := range batch { @@ -1635,13 +1658,13 @@ func benchmarkUnixSocketProtocolV2Sub(b *testing.B, size int) { opts.Logger = test.NewTestLogger(b) opts.MemQueueSize = int64(b.N) addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() msg := make([]byte, size) topicName := "bench_v2_sub" + strconv.Itoa(b.N) + strconv.Itoa(int(time.Now().Unix())) topic := nsqd.GetTopic(topicName) for i := 0; i < b.N; i++ { msg := NewMessage(topic.GenerateID(), msg) - topic.PutMessage(msg) + _ = topic.PutMessage(msg) } topic.GetChannel("ch") b.SetBytes(int64(len(msg))) @@ -1678,8 +1701,14 @@ func subUnixSocketWorker(n int, workers int, addr net.Addr, topicName string, rd rdyCount := int(math.Min(math.Max(float64(n/workers), 1), 2500)) rdyChan <- 1 <-goChan - nsq.Ready(rdyCount).WriteTo(rw) - rw.Flush() + _, err = nsq.Ready(rdyCount).WriteTo(rw) + if err != nil { + panic(err.Error()) + } + err = rw.Flush() + if err != nil { + panic(err.Error()) + } num := n / workers for i := 0; i < num; i++ { resp, err := nsq.ReadResponse(rw) @@ -1697,12 +1726,21 @@ func subUnixSocketWorker(n int, workers int, addr net.Addr, topicName string, rd if err != nil { panic(err.Error()) } - nsq.Finish(nsq.MessageID(msg.ID)).WriteTo(rw) + _, err = nsq.Finish(nsq.MessageID(msg.ID)).WriteTo(rw) + if err != nil { + panic(err.Error()) + } if (i+1)%rdyCount == 0 || i+1 == num { if i+1 == num { - nsq.Ready(0).WriteTo(conn) + _, err = nsq.Ready(0).WriteTo(conn) + if err != nil { + panic(err.Error()) + } + } + err = rw.Flush() + if err != nil { + panic(err.Error()) } - rw.Flush() } } } @@ -1735,7 +1773,7 @@ func benchmarkUnixSocketProtocolV2MultiSub(b *testing.B, num int) { opts.Logger = test.NewTestLogger(b) opts.MemQueueSize = int64(b.N) addr, _, nsqd := mustUnixSocketStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() msg := make([]byte, 256) b.SetBytes(int64(len(msg) * num)) @@ -1747,7 +1785,7 @@ func benchmarkUnixSocketProtocolV2MultiSub(b *testing.B, num int) { topic := nsqd.GetTopic(topicName) for i := 0; i < b.N; i++ { msg := NewMessage(topic.GenerateID(), msg) - topic.PutMessage(msg) + _ = topic.PutMessage(msg) } topic.GetChannel("ch") diff --git a/nsqd/stats_test.go b/nsqd/stats_test.go index dd41d641b..4b5089e16 100644 --- a/nsqd/stats_test.go +++ b/nsqd/stats_test.go @@ -18,22 +18,24 @@ func TestStats(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) tcpAddr, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_stats" + strconv.Itoa(int(time.Now().Unix())) topic := nsqd.GetTopic(topicName) msg := NewMessage(topic.GenerateID(), []byte("test body")) - topic.PutMessage(msg) + err := topic.PutMessage(msg) + test.Nil(t, err) accompanyTopicName := "accompany_test_stats" + strconv.Itoa(int(time.Now().Unix())) accompanyTopic := nsqd.GetTopic(accompanyTopicName) msg = NewMessage(accompanyTopic.GenerateID(), []byte("accompany test body")) - accompanyTopic.PutMessage(msg) + err = accompanyTopic.PutMessage(msg) + test.Nil(t, err) conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn, nil, frameTypeResponse) sub(t, conn, topicName, "ch") @@ -73,12 +75,12 @@ func TestClientAttributes(t *testing.T) { opts.LogLevel = LOG_DEBUG opts.SnappyEnabled = true tcpAddr, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() conn, err := mustConnectNSQD(tcpAddr) test.Nil(t, err) - defer conn.Close() + defer func() { _ = conn.Close() }() data := identify(t, conn, map[string]interface{}{ "snappy": true, @@ -93,8 +95,7 @@ func TestClientAttributes(t *testing.T) { test.Equal(t, true, resp.Snappy) r := snappy.NewReader(conn) - //lint:ignore SA1019 NewWriter is deprecated by NewBufferedWriter, but we don't want to buffer - w := snappy.NewWriter(conn) + w := snappy.NewBufferedWriter(conn) readValidate(t, r, frameTypeResponse, "OK") topicName := "test_client_attributes" + strconv.Itoa(int(time.Now().Unix())) @@ -123,7 +124,7 @@ func TestStatsChannelLocking(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_channel_empty" + strconv.Itoa(int(time.Now().Unix())) @@ -136,8 +137,10 @@ func TestStatsChannelLocking(t *testing.T) { go func() { for i := 0; i < 25; i++ { msg := NewMessage(topic.GenerateID(), []byte("test")) - topic.PutMessage(msg) - channel.StartInFlightTimeout(msg, 0, opts.MsgTimeout) + err := topic.PutMessage(msg) + test.Nil(t, err) + err = channel.StartInFlightTimeout(msg, 0, opts.MsgTimeout) + test.Nil(t, err) } wg.Done() }() diff --git a/nsqd/statsd.go b/nsqd/statsd.go index 494f5d860..29bde5654 100644 --- a/nsqd/statsd.go +++ b/nsqd/statsd.go @@ -65,24 +65,24 @@ func (n *NSQD) statsdLoop() { } diff := topic.MessageCount - lastTopic.MessageCount stat := fmt.Sprintf("topic.%s.message_count", topic.TopicName) - client.Incr(stat, int64(diff)) + _ = client.Incr(stat, int64(diff)) diff = topic.MessageBytes - lastTopic.MessageBytes stat = fmt.Sprintf("topic.%s.message_bytes", topic.TopicName) - client.Incr(stat, int64(diff)) + _ = client.Incr(stat, int64(diff)) stat = fmt.Sprintf("topic.%s.depth", topic.TopicName) - client.Gauge(stat, topic.Depth) + _ = client.Gauge(stat, topic.Depth) stat = fmt.Sprintf("topic.%s.backend_depth", topic.TopicName) - client.Gauge(stat, topic.BackendDepth) + _ = client.Gauge(stat, topic.BackendDepth) for _, item := range topic.E2eProcessingLatency.Percentiles { stat = fmt.Sprintf("topic.%s.e2e_processing_latency_%.0f", topic.TopicName, item["quantile"]*100.0) // We can cast the value to int64 since a value of 1 is the // minimum resolution we will have, so there is no loss of // accuracy - client.Gauge(stat, int64(item["value"])) + _ = client.Gauge(stat, int64(item["value"])) } for _, channel := range topic.Channels { @@ -100,34 +100,34 @@ func (n *NSQD) statsdLoop() { } diff := channel.MessageCount - lastChannel.MessageCount stat := fmt.Sprintf("topic.%s.channel.%s.message_count", topic.TopicName, channel.ChannelName) - client.Incr(stat, int64(diff)) + _ = client.Incr(stat, int64(diff)) stat = fmt.Sprintf("topic.%s.channel.%s.depth", topic.TopicName, channel.ChannelName) - client.Gauge(stat, channel.Depth) + _ = client.Gauge(stat, channel.Depth) stat = fmt.Sprintf("topic.%s.channel.%s.backend_depth", topic.TopicName, channel.ChannelName) - client.Gauge(stat, channel.BackendDepth) + _ = client.Gauge(stat, channel.BackendDepth) stat = fmt.Sprintf("topic.%s.channel.%s.in_flight_count", topic.TopicName, channel.ChannelName) - client.Gauge(stat, int64(channel.InFlightCount)) + _ = client.Gauge(stat, int64(channel.InFlightCount)) stat = fmt.Sprintf("topic.%s.channel.%s.deferred_count", topic.TopicName, channel.ChannelName) - client.Gauge(stat, int64(channel.DeferredCount)) + _ = client.Gauge(stat, int64(channel.DeferredCount)) diff = channel.RequeueCount - lastChannel.RequeueCount stat = fmt.Sprintf("topic.%s.channel.%s.requeue_count", topic.TopicName, channel.ChannelName) - client.Incr(stat, int64(diff)) + _ = client.Incr(stat, int64(diff)) diff = channel.TimeoutCount - lastChannel.TimeoutCount stat = fmt.Sprintf("topic.%s.channel.%s.timeout_count", topic.TopicName, channel.ChannelName) - client.Incr(stat, int64(diff)) + _ = client.Incr(stat, int64(diff)) stat = fmt.Sprintf("topic.%s.channel.%s.clients", topic.TopicName, channel.ChannelName) - client.Gauge(stat, int64(channel.ClientCount)) + _ = client.Gauge(stat, int64(channel.ClientCount)) for _, item := range channel.E2eProcessingLatency.Percentiles { stat = fmt.Sprintf("topic.%s.channel.%s.e2e_processing_latency_%.0f", topic.TopicName, channel.ChannelName, item["quantile"]*100.0) - client.Gauge(stat, int64(item["value"])) + _ = client.Gauge(stat, int64(item["value"])) } } } @@ -136,22 +136,22 @@ func (n *NSQD) statsdLoop() { if n.getOpts().StatsdMemStats { ms := getMemStats() - client.Gauge("mem.heap_objects", int64(ms.HeapObjects)) - client.Gauge("mem.heap_idle_bytes", int64(ms.HeapIdleBytes)) - client.Gauge("mem.heap_in_use_bytes", int64(ms.HeapInUseBytes)) - client.Gauge("mem.heap_released_bytes", int64(ms.HeapReleasedBytes)) - client.Gauge("mem.gc_pause_usec_100", int64(ms.GCPauseUsec100)) - client.Gauge("mem.gc_pause_usec_99", int64(ms.GCPauseUsec99)) - client.Gauge("mem.gc_pause_usec_95", int64(ms.GCPauseUsec95)) - client.Gauge("mem.next_gc_bytes", int64(ms.NextGCBytes)) - client.Incr("mem.gc_runs", int64(ms.GCTotalRuns-lastMemStats.GCTotalRuns)) + _ = client.Gauge("mem.heap_objects", int64(ms.HeapObjects)) + _ = client.Gauge("mem.heap_idle_bytes", int64(ms.HeapIdleBytes)) + _ = client.Gauge("mem.heap_in_use_bytes", int64(ms.HeapInUseBytes)) + _ = client.Gauge("mem.heap_released_bytes", int64(ms.HeapReleasedBytes)) + _ = client.Gauge("mem.gc_pause_usec_100", int64(ms.GCPauseUsec100)) + _ = client.Gauge("mem.gc_pause_usec_99", int64(ms.GCPauseUsec99)) + _ = client.Gauge("mem.gc_pause_usec_95", int64(ms.GCPauseUsec95)) + _ = client.Gauge("mem.next_gc_bytes", int64(ms.NextGCBytes)) + _ = client.Incr("mem.gc_runs", int64(ms.GCTotalRuns-lastMemStats.GCTotalRuns)) lastMemStats = ms } - bw.Flush() + _ = bw.Flush() sw.Flush() - conn.Close() + _ = conn.Close() } } diff --git a/nsqd/tcp.go b/nsqd/tcp.go index 80637d4df..c333a9147 100644 --- a/nsqd/tcp.go +++ b/nsqd/tcp.go @@ -33,7 +33,7 @@ func (p *tcpServer) Handle(conn net.Conn) { _, err := io.ReadFull(conn, buf) if err != nil { p.nsqd.logf(LOG_ERROR, "failed to read protocol version - %s", err) - conn.Close() + _ = conn.Close() return } protocolMagic := string(buf) @@ -46,8 +46,8 @@ func (p *tcpServer) Handle(conn net.Conn) { case " V2": prot = &protocolV2{nsqd: p.nsqd} default: - protocol.SendFramedResponse(conn, frameTypeError, []byte("E_BAD_PROTOCOL")) - conn.Close() + _, _ = protocol.SendFramedResponse(conn, frameTypeError, []byte("E_BAD_PROTOCOL")) + _ = conn.Close() p.nsqd.logf(LOG_ERROR, "client(%s) bad protocol magic '%s'", conn.RemoteAddr(), protocolMagic) return @@ -62,12 +62,12 @@ func (p *tcpServer) Handle(conn net.Conn) { } p.conns.Delete(conn.RemoteAddr()) - client.Close() + _ = client.Close() } func (p *tcpServer) Close() { p.conns.Range(func(k, v interface{}) bool { - v.(protocol.Client).Close() + _ = v.(protocol.Client).Close() return true }) } diff --git a/nsqd/test/cert.sh b/nsqd/test/cert.sh index 63948d112..ddd29ee6c 100755 --- a/nsqd/test/cert.sh +++ b/nsqd/test/cert.sh @@ -21,7 +21,7 @@ mkdir tmp cd tmp echo "make CA" -openssl req -new -x509 -days 3650 -keyout ca.key -out ca.pem \ +openssl req -new -x509 -days 3650 -newkey rsa:2048 -sha256 -keyout ca.key -out ca.pem \ -config ../openssl.conf -extensions ca \ -subj "/CN=ca" \ -passout pass:$PRIVKEY diff --git a/nsqd/test/certs/ca.key b/nsqd/test/certs/ca.key index 37b6d4ffa..8d78742a9 100644 --- a/nsqd/test/certs/ca.key +++ b/nsqd/test/certs/ca.key @@ -1,12 +1,30 @@ ------BEGIN RSA PRIVATE KEY----- -Proc-Type: 4,ENCRYPTED -DEK-Info: DES-EDE3-CBC,D6208487450BDF1C - -tucU/4j6agGQlW60D8V3Zr/QHcLhhyFagres1gGdWfGIqluNZb7omki/XidHXJSG -eB9vV2Xb12/8umc31e7Mnmn9hd34230v/KlAnJ4ukDpJpbmjnEx3F9uiqYFi/yxQ -avSsfF6Tsh3XOh3Oe27I/xfYx37g6Agd+EQEJ1hvWvygMIJMTDMP5ZaFoZANtFLy -hDEZ6woJSn9avF/L+1GW8jl2aI1QbdKkK0jDHgFAwUI4sjWeXvEQNNYY3trTIoMo -wab3vi+4XziFONbS4OZrZUYfZPB5YOFbtT2whzggp2HdSTiu48/Ld3N8SjuMrKfm -uR+nd+ovQ5kVWHInzWAIXSyPhgR9ZY8eyXaHNJJfzNu3HY72lfzD/NtZfacMRBr6 -M3Wg/OKPS7ZrtqCWkY9P3KK9Cul8Jzy229fSqHo8Rg4= ------END RSA PRIVATE KEY----- +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFNTBfBgkqhkiG9w0BBQ0wUjAxBgkqhkiG9w0BBQwwJAQQvUfvUZrAIMXiPRHb +fRu+ngICCAAwDAYIKoZIhvcNAgkFADAdBglghkgBZQMEASoEECnIcBk1sDUld+fL +xs08odgEggTQUtFd4tYC0sTnZJGEgbFatr6ivDL3Wggth65SxsL1jnkqrm+Jk/vp +sUJBZUyNzu7TtwUSM8NiPfkpeOA+pq/vdYIGQ5auPTm012q2L989vFJfIhCiAysu +12XJ8Ofjj8d8fS7xDsDrLNFCYFi+pgqLQ/0vTPoO0LaOHp5jv65pmofdDYkJAort +EGVUE5DCkV2cyHCQOTX1KS+g/13ODErnBSmTRN5XLQQQoUTas150zxaplHHHAH2H +vx5LjNZFC/1NlXaveMc7MMNJNhf/QCI7cdle39S8ZJAZz/IevOvS+wE2bbbxEM1m +EwXFjhYeein0pD0JXzRjluqqwAfVDQMy9PC9Zlmn0brl7OobElOwNQRuMG2NHoJa +cSJdm+0v6a7YeAa2yHakBhvdNHJZZaBFEUPAYun+NTUgbueDmAlPyW1G78Dcy9yL +2p4weKKJYuyneU1sXXXQddRaz9U/6LJCsCoO4EsdT4vvKN//0LDSVPZR94QKKaLv +OQDwadGy/J3uzb0dyOGZAoQli43bddbq5YamU4YTAXQcgsp2ghCfQThDrYERml1K +AEvK6GRzOBA1vCFYc7Gpikt6oY2LHLpGemR6FUxuQx2sOYHfFDJnoQ0ZiH0g9RBu +1J4q720fqhviS4lRpoW0byzd1ir2jP9YP/VArLNA24xGElW6ecdsAEJOxDJ+ozg7 +l6bbwuIN/4BrZ3ixwx82NWIGUqjs3ZOPG84jXs9Hipg4dl1xA6jmaE2Ig03BKTLJ +a+njGvlIp31qtYrI6QCrAvoqllgO0yBJeOa+441ktpfODsJmi0icUJK0IgNXmTHj +D/RNV6EBJFNS8UWIU8x/cXDhkSVLFt+7sKa6GvuQbMGqN/O7qRP5InNMZY8Q4XGx +v5m75oxYDgt9vQiTecpESGtEl5sIZpI+wwKXJbA37IHkP9nyU6ezfs+YV4ipO4K9 +OZO3zz98MrBDTArTxFUmkoFRDzeGA1zsBVxl43O75yklxBdaEV2SGIXgdji99kKF +Gy8viEpny5b3Z1fU6tCUSIAtXjps7dv+Y9Aa9MfJxBKhQfajU/kU+aDAvK5jNE5p +ERJXgrj8wjeSJOkJkPZoP4eXWnKsoRKNF2aIVYYKkuWYOCIIc/z8+yWpdo0ta6XA +6EtzMzYT2WF/TmfzvraRPGEtMjDOInh9S3b5JmXCB5pEQHdWOXhBi+CGtRfSZKmR +HXhU6EtkmxQhfq2R9DNPuprN4t+T/u+KFZLGOML1USWcKHQOE5lY5qW1WbMeHsuo +UegHyoLL9bAS5FTQUB7XILyVB1zL3dsJCinVpYmpiMVir/fSFNnFWGqCTDoAoNF2 +62CAweZ+pcGKC9okCadIzXzr+5gu/ToLRooK4g823AABWHMGrApU523ktgXDewgX +6Ic13ciua9KIEJnB0AsivxDH1GaLuETUNSz6CjPgqxzZ8mOaxoa4LzbbuZ6sxm15 +FaUBi7INAVwHASKl1YKDxWETtYbwgMUPt81Um4NCsRNkf/93/3xApz3InU6tD7Iw +NCrrN4ZprPO4Xu97nXbNtAgvFjjaaWvutbnP8AIRX7xxPJoLxPyLApY52m50K/cA +iCe5BbY/RitNaMxcJ2cZUA467EPR4qrIhFYsE4j58RYFf8fOzV8u0y4= +-----END ENCRYPTED PRIVATE KEY----- diff --git a/nsqd/test/certs/ca.pem b/nsqd/test/certs/ca.pem index 08150a568..0b77d96f8 100644 --- a/nsqd/test/certs/ca.pem +++ b/nsqd/test/certs/ca.pem @@ -1,10 +1,18 @@ -----BEGIN CERTIFICATE----- -MIIBVDCB/6ADAgECAgkAvHG4Z/7nX/gwDQYJKoZIhvcNAQEFBQAwDTELMAkGA1UE -AwwCY2EwHhcNMTcwOTE2MTc0NDE0WhcNMjcwOTE0MTc0NDE0WjANMQswCQYDVQQD -DAJjYTBcMA0GCSqGSIb3DQEBAQUAA0sAMEgCQQDJAM3Tr1BoxlLJtTy0oRcp93dT -9hhHwms8P1V3k2FpXYRS4deUo+uwcAM9KGDt9VMXVBEchtI4VYTvLgatBPUBAgMB -AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMyLx7rjKBe/xZQLnVzI -uqNNVzxRMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAANBAJiN1XgPPlQ2 -z7PhtzXStaz/BJVqhD7g9fsZsmoPX4ifDsTfzUsRB56Aq/NTsKiIYQkFPHH0donG -++a5ZVWjgYk= +MIIC6jCCAdKgAwIBAgIUU7yNoVgv+VAA3jIq+NtNd2uj4JwwDQYJKoZIhvcNAQEL +BQAwDTELMAkGA1UEAwwCY2EwHhcNMjYwNzE2MDQwOTAwWhcNMzYwNzEzMDQwOTAw +WjANMQswCQYDVQQDDAJjYTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AMjUBsJDsK0heNoAsupsFKB4qvABNjgrR+TjbMaRxq/wWDP0buUKC209c1iIPCAq +8rCt3w6NHOEsClQXjLgK+09M2vkLJXDQDxCY+d7TjTwnBMUyq8s3VUdYHv8T2sjP +Dnvtatc4fdZkk/Yoemf01eENtU8SkLAlk01ckqMJdvuJZSCiteiwkDB7iHcJRshH +6b6R2eNJD3sIJdQHqFMtZ8dYXgSPDwBjq9RL1dbidmIpW4+RZxgERcWFER0AS3WM +BK3M9zWV2J8xaN9a6Sy+oYMbkFFy49aQGuD5+vyNyh9wZigCVuGV6syMltGOpi18 ++qnqXjM3yp1OTqaRNE2mbJkCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUSIex/4DUEkgoHbjeLziS8MXbxbwwDgYDVR0PAQH/BAQDAgEGMA0GCSqG +SIb3DQEBCwUAA4IBAQBHPt/3jHoZJ3BA/h1sZT0fNY84VUrRp/KCtMl010siQE/K +2zaM0PsAe4kNDsfaRvsJh64faC1lxcsRDypvxzU894CXrPfyeqgNTvcuZFCaCnqb +eyWQloBzZ9oJFtPFoMTkRmsP7o5hfvpZswpQTF1KTfKeh80Z2K8XZIELlmfM6TWC +iAm5es/fvUhERX9nEWEvCp5lAVv7JZ1ho07XaS+cU0Y7vgD+dTbloOxhN9QGnkLn +5yCUUDLWvygiG2utf5B6mnB9o+WvGLYzqvZKsui/ZUoLyKBz9f5zrJmDp6n2mlGH +AWdQV1aM0yZBuxMfHVhB+KTv99T23vIi25pDO5pX -----END CERTIFICATE----- diff --git a/nsqd/test/certs/ca.srl b/nsqd/test/certs/ca.srl index 383e68ea0..40655e03e 100644 --- a/nsqd/test/certs/ca.srl +++ b/nsqd/test/certs/ca.srl @@ -1 +1 @@ -91418D04995922E7 +28984F6B710840EA4D023FB6A19FE98B0FAE6E18 diff --git a/nsqd/test/certs/client.key b/nsqd/test/certs/client.key index 7993aa121..d801efc7c 100644 --- a/nsqd/test/certs/client.key +++ b/nsqd/test/certs/client.key @@ -1,27 +1,28 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEAuMz5IJ01Wqaj2qJAU7o2aoc2iP1BRhTba+cWrsjbZA+6kXAk -19Dlz/nNK8gxsBMl3rzTGWXKUm/rKBDp680zJkj8nzcGApGlzbDoqXym8ixOniOC -aH/RODPC8OtD2UozeXlUOQWK+ufkMvmVBc/IeJyFkcm7jhX+LHVFn+3iWLRNbzGm -hbf8oNHvybS7HSuV3OYiHDJxA0d6IgozqVOYVSqdDabQ2FN/8nKzpMHjwMpfT008 -5hUhr72E5XuJ3biPUwoOrRETSa1/EQcAEH0wSwHU1AGdnGh3/5ynVupfef0qkyqw -NseYs9U++IUFXqA1IuEmAlJn5QczAHjPQe8xBQIDAQABAoIBAGx4CyZEgCOUOgrD -P2SloPkIIk9n7x82cNA11I+E35kszkI9g7KVL77SDcZL/DYwFwNU68c1gvq+LFXZ -D6RTTlmDb5v4TPPHD33a/8UzoD33GbIif5HcrC4D28FTJgDtV6dOOsw5X6kD4WK2 -Me02V6HLpW677PVqHUV1FAfaNgf/1SIhJCechYSO+3pKPtli8DnsmOd336wNtWZR -Q3Ctm63Eq7AiLmGLOkLYtll9Kr6WfCSFHBmqJg9MsQEfINXMCOB54Z+xkoijjJLO -zNSk/3XvppB1JpmAusbo9Mq03Ci9JdinYSKxwVOG6e+5cosrOHpDQyZIWa87ZTpk -kjLCgEECgYEA33JCGTEwaqfAuYOspCZvi2Mqz7t6QiwvwxgDf4JFLgDQArJfzKlC -bAzaSU8bT+SN96CF9LU4XekN5/paGZAFjWxraPkK0oL28kQrtzfEQv2XL6GFoNAh -WsQtoaGddL9VPWlCiHeueYERIDNrZCaVeAx6OV6W3CEwGOkRiQyntlUCgYEA07lf -LpxF8aAgMToq3++D5RGAXaT2PYxhZZFb5Y2tS7a4T0ulQwXQi4H2dObGJ32zCjFG -ls1H91mNKGBbyKnF1jT/dt/acqymvipASm1xq6uysIllA4xp56sDnJgG9bnXjYFY -m2yVNIoIQGZ7jp7e6t1KQ9San6V8asWlvBLXX/ECgYEAuhF9dVj+xnH3DQTXSMIw -9NOZnO6zelMtWrqufwnN7ecDUJuVJupzw2JYi99yEO90QRbNNd+KlrkxuVFCojLK -TOBR+VIZbv9cAJZACQxJRLfDpAhPLIDkpZ7jmMrqQYPqyX7TxqxTAB84UaY/8WAn -65YIWamo2ppQYQ4Eaim9pxkCgYAMwfW/TEFWruxhqvycY8VRzz0p51/DE6tmwFyG -N4RCtK7kcE1z/Wy0i087ehBknslkCtYTDimQ+P9teGjvbXNzVdwy4Ig8MrUVblxT -X8birkTlKFJC5XoYMJDWJb79nYYki6+4JdHTyaF3p/U4AdCy3ES2U6BBkGov0NsM -uyHpMQKBgGc9wIGHwAGLg3iVHGXbXELdpzVztLRC7D12TPfdtGBLTD5NH5jAx8K/ -w61+l4tzFcK3jfWzwdme277cBgfq/aw2DDt07vkOvPzhUwVZiE39bfddfIvyed99 -XzEMf8THh5wdm6mLsOVgdfOfFcDi5ReIv1/7+eOd/MQi8TxIVfAu ------END RSA PRIVATE KEY----- +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCrp/fU9Eu4HFIi +uH7JGgMjByv1l/887VUJOHXuf9s2pdfNBXI0Gy9zwmamdxun1KLDbdP5ujbjQOKa +KnOZLczaZRyol0dduw6nvh7PJAnUFlDIBC88rIWBBUfrcVU/zXXfkda9FCEZNRts +b+f3IskzHNW3K/OoyYmLS5JkluDtq8WGQ2vWdG8A7DaM19LivLqx+3oTZ/S68fso +2xwYp5ikbbOEfot824g2RJzqblr6CoxCttX0COo4C7G1EadW9MsZ3Xqbh7Xuo91R +2TOYUoOrK0eB6sPn5yr6wd8LUIS14Fuxdsnps6Xwjyz1Uq2LXrlUbbc4TJgIlB0l +mJIN/D1FAgMBAAECggEADP/o9bsp2tUQ5qk94iFIAzNBVyro0lE6Qzr/5LfRFFKQ +mmm4VuLc1Ubv0C6CrSieH5pl1xU3n+k43/+pW9HgoC96cU1s7a0YtIe3keytmTQM +GmxatB0an9qUXOvAeYGn/25DgB6R98nnpu7TTIous4y8+09m91g1RD53uooZ7wBs +W3oyxOpxfaRFbEi+fzBadZ/aem/5NP1ArcVSZc/Ke2B15aqYwlTesS/CWxp4kmYz +XeKbKbkXrfvhleJ3Q5MRjz/Y5E8fYMvO/vHaZI/R8G50LNRrbmsEu3tgmb7ETOir +TrsatKBaJdy9JH3jRq/LYHJ9DB9rdl1bw2ZWXiCedwKBgQDt+ejqWSWfY82Fi4dJ +Jjuk66d3F4Y1walag7D5wG0vsRQqry3i9Az9HBI2e3Yfa/v6cIO+V0DnFnKJYgQI +jr3ZLZWk7lzvLy9Hjsena4ejDdxtf7P8K5pS+0yL04us09nBQbON4AgJwVJ6GmAQ +cQ6AHPQd2RlU8jn0ggFbO6lOIwKBgQC4qC/I7jJlLsSp8cWVk9C77G38R9ySa0/Z +QMOebjnT0wDjh7RoxJ/T8F43Eq0dU7+3RbbeNEItAp8RhV3nyGmSizY/SXZXB6P7 +BIFqa5a2elVuX1Y0ahEs1pwifoa65P5DDoEp8nTV0GeR6NjRh60tCjqnlcPT5o4t +3G9qPXKZdwKBgQDfKTjK8lg+lOe48PQnm4vZBweevVek93upns8KFfIOBB+mO2pr +ZnL7tCQ8JSDLLIc5/eL9TnNVgQ5dWKXxpHHRxFaNON27imLq1rDRhhvGwwvPPy74 +LadlY7UPdoyHwI52FPec9tZy13BRgoRNRsfTSdN+XgTMTO4eJP/CnzsQQwKBgFqe +nyS6UJz7QKQt9EsdiVhQBQHDumlYpIz3jYiYi2R6rnr6w/yOUelOks3wKmi0CufE +HKQbfUZdfPa6PoVbAwRZsTuJr7uyEjVD1scFGadfjcFmpAWA8ADTKTh8Y14gtu7t +lVGinNe5OLqQTKc3MDNkS7imdL3u7WNwRHUcxrqtAoGBAKHnNdm3oD5pF6JDXHkg +7mC1yIwxWF6eEId5FVvP/x2BwBRt/ZQ8fvTPqhtoQOSbdJsXRsbsQ8Vycg2w2BWH +eAY/CNDRQ5HS7xWG4sFI/LoNg6ShFGfj3M6DUQRbVjfYt4EPrzuQFlbs0z+cn38U +0mhtwNmJi/XYPh/1dhIe7Eyg +-----END PRIVATE KEY----- diff --git a/nsqd/test/certs/client.pem b/nsqd/test/certs/client.pem index a6480ddc8..2d20e4f0c 100644 --- a/nsqd/test/certs/client.pem +++ b/nsqd/test/certs/client.pem @@ -1,17 +1,22 @@ -----BEGIN CERTIFICATE----- -MIICyzCCAnWgAwIBAgIJAJFBjQSZWSLnMA0GCSqGSIb3DQEBCwUAMA0xCzAJBgNV -BAMMAmNhMB4XDTE3MDkxNjE3NDQxNFoXDTI3MDkxNDE3NDQxNFowgYcxIzAhBgkq -hkiG9w0BCQEWFG1yZWlmZXJzb25AZ21haWwuY29tMQswCQYDVQQGEwJERTEMMAoG -A1UECBMDTlJXMQ4wDAYDVQQHEwVFYXJ0aDEXMBUGA1UEChMOUmFuZG9tIENvbXBh -bnkxCzAJBgNVBAsTAklUMQ8wDQYDVQQDEwZuc3EuaW8wggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQC4zPkgnTVapqPaokBTujZqhzaI/UFGFNtr5xauyNtk -D7qRcCTX0OXP+c0ryDGwEyXevNMZZcpSb+soEOnrzTMmSPyfNwYCkaXNsOipfKby -LE6eI4Jof9E4M8Lw60PZSjN5eVQ5BYr65+Qy+ZUFz8h4nIWRybuOFf4sdUWf7eJY -tE1vMaaFt/yg0e/JtLsdK5Xc5iIcMnEDR3oiCjOpU5hVKp0NptDYU3/ycrOkwePA -yl9PTTzmFSGvvYTle4nduI9TCg6tERNJrX8RBwAQfTBLAdTUAZ2caHf/nKdW6l95 -/SqTKrA2x5iz1T74hQVeoDUi4SYCUmflBzMAeM9B7zEFAgMBAAGjdTBzMAwGA1Ud -EwEB/wQCMAAwHQYDVR0OBBYEFMzYXiTD7moi0oXqSQ5D2LsO51GXMB8GA1UdIwQY -MBaAFMyLx7rjKBe/xZQLnVzIuqNNVzxRMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUE -DDAKBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAANBAAujxas6toRhMl/+kZrly0G/ -AvjbA3WY5cLLIdffGdQ5bsS3aOP23nj98ut7unNUNsCo+eUwpJgvabnFnL+NFZA= +MIIDmDCCAoCgAwIBAgIUKJhPa3EIQOpNAj+2oZ/piw+ubhgwDQYJKoZIhvcNAQEL +BQAwDTELMAkGA1UEAwwCY2EwHhcNMjYwNzE2MDQwOTAwWhcNMzYwNzEzMDQwOTAw +WjCBhzEjMCEGCSqGSIb3DQEJARYUbXJlaWZlcnNvbkBnbWFpbC5jb20xCzAJBgNV +BAYTAkRFMQwwCgYDVQQIDANOUlcxDjAMBgNVBAcMBUVhcnRoMRcwFQYDVQQKDA5S +YW5kb20gQ29tcGFueTELMAkGA1UECwwCSVQxDzANBgNVBAMMBm5zcS5pbzCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKun99T0S7gcUiK4fskaAyMHK/WX +/zztVQk4de5/2zal180FcjQbL3PCZqZ3G6fUosNt0/m6NuNA4poqc5ktzNplHKiX +R127Dqe+Hs8kCdQWUMgELzyshYEFR+txVT/Ndd+R1r0UIRk1G2xv5/ciyTMc1bcr +86jJiYtLkmSW4O2rxYZDa9Z0bwDsNozX0uK8urH7ehNn9Lrx+yjbHBinmKRts4R+ +i3zbiDZEnOpuWvoKjEK21fQI6jgLsbURp1b0yxndepuHte6j3VHZM5hSg6srR4Hq +w+fnKvrB3wtQhLXgW7F2yemzpfCPLPVSrYteuVRttzhMmAiUHSWYkg38PUUCAwEA +AaN1MHMwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUo6AgTMKXqu/gMFKDJN5cG2/+ +Wc0wHwYDVR0jBBgwFoAUSIex/4DUEkgoHbjeLziS8MXbxbwwDgYDVR0PAQH/BAQD +AgWgMBMGA1UdJQQMMAoGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4IBAQCMrSDV +OAY3BeD9os+DK2DGty9d76Tj+afSTIb9GeZO6wmfqg9bIEs9FEA9mMI8tBvM4MpO +gp69t4Js0GryVhaaEZviv/RYzfRcpTENhHNojMXsV22hU6GojACbAguHTNyUJw2Z +XH+hFF+YmVVgW3a87tmCeCVblGJn7rWarX8COL10f8UAbEEEe25Hg8tDbtuv8QJj +9EbKTe9KTWG11zGSUEVVuIo4AnAvdhRmmwNblQRQ3da0pJgyWCP9Bl/ITC8zL+mM +8W3su1snmZ2p5GbdE6RQfbNnU6+GfMGudPKkUEoHtGY+bsTM7b22VgsJl0iI+OGU +974gsM93BQcad8Cq -----END CERTIFICATE----- diff --git a/nsqd/test/certs/client.req b/nsqd/test/certs/client.req index 1ceb750f9..dae584bd3 100644 --- a/nsqd/test/certs/client.req +++ b/nsqd/test/certs/client.req @@ -1,18 +1,18 @@ -----BEGIN CERTIFICATE REQUEST----- MIICzTCCAbUCAQAwgYcxIzAhBgkqhkiG9w0BCQEWFG1yZWlmZXJzb25AZ21haWwu -Y29tMQswCQYDVQQGEwJERTEMMAoGA1UECBMDTlJXMQ4wDAYDVQQHEwVFYXJ0aDEX -MBUGA1UEChMOUmFuZG9tIENvbXBhbnkxCzAJBgNVBAsTAklUMQ8wDQYDVQQDEwZu -c3EuaW8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4zPkgnTVapqPa -okBTujZqhzaI/UFGFNtr5xauyNtkD7qRcCTX0OXP+c0ryDGwEyXevNMZZcpSb+so -EOnrzTMmSPyfNwYCkaXNsOipfKbyLE6eI4Jof9E4M8Lw60PZSjN5eVQ5BYr65+Qy -+ZUFz8h4nIWRybuOFf4sdUWf7eJYtE1vMaaFt/yg0e/JtLsdK5Xc5iIcMnEDR3oi -CjOpU5hVKp0NptDYU3/ycrOkwePAyl9PTTzmFSGvvYTle4nduI9TCg6tERNJrX8R -BwAQfTBLAdTUAZ2caHf/nKdW6l95/SqTKrA2x5iz1T74hQVeoDUi4SYCUmflBzMA -eM9B7zEFAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEALD1VjbBjaeX7l7JR4IuL -wrHVrFDiRYsgvqyw39j2MC95VwrGwzf4cXCE+RuqE/DhbV9UI7sWKaJfFs9Usq+g -VSoKnHSEylt34y6ABSc5eAik+GnheJZbJ6UDjxcvNd0UpFGMrHbsXVyQd0Y1XAu7 -nxCYIa82kNA+Opb+ra03hkLC7wvRLbXTOB2g6JLkyhYR6S5GkOFTNnz2AJerN7zt -NEL7owlRcjyIsL5tjDpDH1944NNtzhgmrUeIjB08reayuot9RKznMVGwBfY6DIHM -Q4uNN3CMOOoAHr1UzvBf/qfvb6ltPTMKSV1OncLlC3C59NoO8vhKIHCN18Ya2OMu -rw== +Y29tMQswCQYDVQQGEwJERTEMMAoGA1UECAwDTlJXMQ4wDAYDVQQHDAVFYXJ0aDEX +MBUGA1UECgwOUmFuZG9tIENvbXBhbnkxCzAJBgNVBAsMAklUMQ8wDQYDVQQDDAZu +c3EuaW8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrp/fU9Eu4HFIi +uH7JGgMjByv1l/887VUJOHXuf9s2pdfNBXI0Gy9zwmamdxun1KLDbdP5ujbjQOKa +KnOZLczaZRyol0dduw6nvh7PJAnUFlDIBC88rIWBBUfrcVU/zXXfkda9FCEZNRts +b+f3IskzHNW3K/OoyYmLS5JkluDtq8WGQ2vWdG8A7DaM19LivLqx+3oTZ/S68fso +2xwYp5ikbbOEfot824g2RJzqblr6CoxCttX0COo4C7G1EadW9MsZ3Xqbh7Xuo91R +2TOYUoOrK0eB6sPn5yr6wd8LUIS14Fuxdsnps6Xwjyz1Uq2LXrlUbbc4TJgIlB0l +mJIN/D1FAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEAh7Ne4ws7biLCPbp72Y52 +r7bXgYP2/DQZk3wegrwd4+Yj3LVhTrMMpHY1FAoL4Clo+nDHL2NC8P8cPPWxIhS7 +E8DhSHyMY/RR6q7Mdl1K7SlSy7YGK1N4KFiX8TPgjbs0Opg5MmoYIkKS54q8DHTB +2b4YIvnLCGEkXzo9MZNljZUXCmzaNn72iX76Qp0Pq9oJBA6N7LHx8j0Va1j2T184 +0z+u+1cP87HkuKGlTFqkRZYf0j/1ih2WSanSPSoZrhwAaJPbgkgjyVGQlraFe60m +9Bgdyj6MlEkr15AAo8jP+VsmkAE7Dj4liKQi8ZATRsgbtEBgugl57OEOZ85NTmW4 +uA== -----END CERTIFICATE REQUEST----- diff --git a/nsqd/test/certs/server.key b/nsqd/test/certs/server.key index 446b31820..aa338da8f 100644 --- a/nsqd/test/certs/server.key +++ b/nsqd/test/certs/server.key @@ -1,27 +1,28 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEAuYs7NerYpXWq/IPaBGriHobhIs/i4AJHra7QhZ5N/EfBCb0N -6K3tI4GRHMZ4lB0HwINWmxaPs6D2yDCxpGgnru6qCu0/91+Lq+GEZj+Fz1E2yfCq -tecTySvWf9en+SdTKFZTGGIAu3zFcozuX2fdhkjJ6ibZhnrXKlPU4IN0STkkRfFX -+yb/6P88mGh7PZKBb67Qw1bppzXE/SWgHVqDqu++whT1quwxnRhh/SHgwugN+6iK -uTDcJ1jQ1QWe+xna7Te6nNBUvL6dV49jpoDOjHsv+UaAvzNeHCHqypTC0wwYHXyg -TTAU+E20c2NOCC7P0PAid1liNeuuEWtM2bRrFQIDAQABAoIBABPzc7d1fDw2bd9f -Mic9cvkDWdwLbILX2+tCG+vyPMJ+2LP6Xy+A3DnwKbFlafvLL1U1Ci/8+hC/oymd -isx54qJ9yU0Je9JWtMcTpc/0zqefPPvz4/dRVKBSFWuDve0dnGR++8poZ1nBrd2G -Z+9cVMamtwd1i/hY5yAHCaHmoK9qxXuSjtbPkqDqruloGO5iT+tcICjAeWyJIx1P -5VJjuKDx4AhU4B8DpBSTtA02BKltvr2K6D4zhJ255oI4iLUkYk4IwxB7yZH+6Y++ -mDa6e8iM3ut+qMkCxto/CfMCqYfoRzmykiazZ5qFXfGwv3OkWUEOBXU//Vpklvnh -OQWYL/UCgYEA7mkKXbCrCNJEdly4LVLPKPFjVUPhMdXcqdnoKZ6BiVYFMqTuG4+w -o/Rf6ZpqZ3Rf656/ypd1atVvK2g4zfq3j1W6lDnpLjKaLhc8a+ZH4NWXBORIzlUW -aR2xVcPpAokor37FRAWbduiwVSCHlDtg48i+rvukyqmeRBKjrIgX3lsCgYEAxzut -5GiMZ9TkjqYXdlUDIDKWMHMfLfRY7+Q/cBdr7AfiMVw4PIWJG/IuxCGwGp77gRg6 -BeBsi8Htj5/EGbRiK4kjFyf8LqYGOeYLZ3I8+olr+tNmF4/yKwxku3VylpmrpCAV -/8emso1rAWo6Y98MTNSGgvLqhDU6OD7tTSv3908CgYA4+aVeio/1RbrSxonFWxri -3/0rLVOuAzv+43KWL6kpVwNa/QtiTs6aABbDzwFKxAcAWinfkp6e727n4rpgj2A6 -wvQZ5FUTk0hBZ5ArAReAZcr3gk7b8H2wlUYCBxWyY3Dzr8oY3XYvzqAFWAbOp/oZ -tanMS5swS6TlA8dVvhhmLQKBgGZwcBPOEctdcntKOSwVv/qxJ/oXZ0O4rHYENP4M -fOgqkYnxsdSkkH/3AUbFT4gQkJ6q90KIRyeA+gXsDudskUFzTMCeRZMyuGbSurBg -06u6NvQL+CVLVSf/QlgEpnt63f8QpF8Up8iM4CUlGoq5Z9ilOdhg0GZT+/BpopgY -cHIPAoGBAKyLumgeG+gMFK5x/Fi6zjBT5MK8Tw0VMkahW01Jx2laYibS/a8AEFmn -ySdrmLPkOmmWgXCk3m2m5PkvM5qH/KNugOA0+WX2CTvwt4ZgwWUalQ5R43wSIeDC -MXVfwC8uE66PmpYgmsu4H0vnCGfacOCQhfdq01SLobgBiQSrm/6D ------END RSA PRIVATE KEY----- +-----BEGIN PRIVATE KEY----- +MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCy/7ebzIezybQE +f0+5RS7XzK7QSlA/9V/otru8Dm4KM3p/U9Ne4ncIPwgkvTtoJym4GL76RFrPI7hB +X2vaWNdihZUp8sjbn33IzKFIoAoARLDkRJikp58H2Mkm0Lw680zmG6FufoMFkX2X +OAosg29CryWnV4b7tWnMHDU3zEpRajFostu/cgc+98sICAbkKpnA+hfp5l2z8ua7 +ghA3erXFp6oBRfa2W2+R3IKYBEuvxBWiPDuQ9kdzuB722HKEhmQUpjLd33zAh9e6 +i9niC56HbvOgLmBef8/0OKXobhimjskU86ZSgTgDNoNhXJoc486iH+HDwvWW4zQX +sfxCz1ZlAgMBAAECggEACswvgI/J79J5sCZt4g3bptuLVWKQ4grPNPPbnJsnkCii +zw4jcKnV5wLGXvul8GvMXHVBr/RySznVt5El/w805ECNSvErpJ6ZBoUxhXaso8TW +VtlnISeWCZx40IVEQC9vssHKmdEP3kTJ1Va6u7dXUtJ17Fj0pOJrS2C4OnFxr496 +bhgB1Aq7WuaKoH9OjL72sb4JNnNqKnT7XVlTEB92h9Y+yA1aZcSTTyE+KhWc8dAf +O1g9u5gIj7BXrd+QWRg4D/WRz8aQR88girnKqppReTjgZMuKREtG3BfLF/iYegsd +2TI7ftzU3TLOPlRd8TMu2wzSit8xhx6jr6OqqT4DAQKBgQDozYPv2R2pX80dMQad +4FJREJH2Yys2aR5kVhsCbkBULvofbgDtMuhGjaVrjqs8YN7p6pOF1yJGQJVH8fWU +hyotIkUAWTUUVco5zfhK+Dy5NoC+KmOE4XGLJgcndnhdWOzTeoir9HroAFko+he6 +seGdGvn03eisrCSluFP3L233FQKBgQDE1byypxeJG+n/UkLU7/mPs6PyRDVJGlyj +DfswDk9GyC/rNuBgxkH2cJ+Qj7VVoGsEd4rEJ8xPcT4qG6SO2+jf/X+Pl7j+7X+w +G71t/fK44WYeIFHIPspfnKJ666JML0Rfhd0TVc0WHitw831ogwZVj18Q6/TwLoLM +pjVgibW2EQKBgD69VDdJbgL9fIvHcJ8Pm1+ZdZzPMRAi2Dv2MKVBDTkix+m8fadv +NsX82n3YHzHQcYLc4xEI34XLVe/jt2ll2+n5+FqVsAZg8HUPm0CpEcRgeeXGCrf/ +AdicUQVDmkCd/IUp2rds1cq8fUrby5VW5xSt9nsVauVOJzo6KPbO43XZAoGAV6tz +Xoc53mHGeWgkSD+SgkTa8t8adLL/K8jgZmkZOkeTwEoy6iej3aYQDA1WEQtgXx73 +eaLYR1IDBDJHuzGLqah5FnXXegRCaSgR2VnQsDQEjcqLYotFDAzx+ZnWMeSjqYAw +FZqTvBQ3+RkadGBXg+hVyW2vLQMqUwh8ocD0ZGECgYBhBvvCNCgHnx4Tonhyz+IA +q4QQEF6a92ImCGPmlBKVbXTkCe1OiiZWPQZxk+RkaPwsUxghiKc/JL5xpzObKqB+ +l9nvNmNOa0Mtkv/ny/ZKM77zmaxVVKvpkK2LgZMdriJi2n7V12FL54zhYfUfXvzV +0PcBiHo1CfUjEc6Hf5hmkA== +-----END PRIVATE KEY----- diff --git a/nsqd/test/certs/server.pem b/nsqd/test/certs/server.pem index 12032e5f2..6aeca9556 100644 --- a/nsqd/test/certs/server.pem +++ b/nsqd/test/certs/server.pem @@ -1,18 +1,22 @@ -----BEGIN CERTIFICATE----- -MIIC3jCCAoigAwIBAgIJAJFBjQSZWSLmMA0GCSqGSIb3DQEBCwUAMA0xCzAJBgNV -BAMMAmNhMB4XDTE3MDkxNjE3NDQxNFoXDTI3MDkxNDE3NDQxNFowgYcxIzAhBgkq -hkiG9w0BCQEWFG1yZWlmZXJzb25AZ21haWwuY29tMQswCQYDVQQGEwJERTEMMAoG -A1UECBMDTlJXMQ4wDAYDVQQHEwVFYXJ0aDEXMBUGA1UEChMOUmFuZG9tIENvbXBh -bnkxCzAJBgNVBAsTAklUMQ8wDQYDVQQDEwZuc3EuaW8wggEiMA0GCSqGSIb3DQEB -AQUAA4IBDwAwggEKAoIBAQC5izs16tildar8g9oEauIehuEiz+LgAketrtCFnk38 -R8EJvQ3ore0jgZEcxniUHQfAg1abFo+zoPbIMLGkaCeu7qoK7T/3X4ur4YRmP4XP -UTbJ8Kq15xPJK9Z/16f5J1MoVlMYYgC7fMVyjO5fZ92GSMnqJtmGetcqU9Tgg3RJ -OSRF8Vf7Jv/o/zyYaHs9koFvrtDDVumnNcT9JaAdWoOq777CFPWq7DGdGGH9IeDC -6A37qIq5MNwnWNDVBZ77GdrtN7qc0FS8vp1Xj2OmgM6Mey/5RoC/M14cIerKlMLT -DBgdfKBNMBT4TbRzY04ILs/Q8CJ3WWI1664Ra0zZtGsVAgMBAAGjgYcwgYQwDAYD -VR0TAQH/BAIwADAdBgNVHQ4EFgQUt6UXJ8BQB++I/cQG5ZgaiUyqOE8wHwYDVR0j -BBgwFoAUzIvHuuMoF7/FlAudXMi6o01XPFEwDgYDVR0PAQH/BAQDAgWgMBMGA1Ud -JQQMMAoGCCsGAQUFBwMBMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQELBQAD -QQCCwm0F2eTmtIcKDxrXGZ7q9y9mfsROfYaCnH+vKUDw2vmqQkInzhLeEElDGQcR -ww0IKCnDHEruNb2tKyQM/70L +MIIDqzCCApOgAwIBAgIUKJhPa3EIQOpNAj+2oZ/piw+ubhcwDQYJKoZIhvcNAQEL +BQAwDTELMAkGA1UEAwwCY2EwHhcNMjYwNzE2MDQwOTAwWhcNMzYwNzEzMDQwOTAw +WjCBhzEjMCEGCSqGSIb3DQEJARYUbXJlaWZlcnNvbkBnbWFpbC5jb20xCzAJBgNV +BAYTAkRFMQwwCgYDVQQIDANOUlcxDjAMBgNVBAcMBUVhcnRoMRcwFQYDVQQKDA5S +YW5kb20gQ29tcGFueTELMAkGA1UECwwCSVQxDzANBgNVBAMMBm5zcS5pbzCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALL/t5vMh7PJtAR/T7lFLtfMrtBK +UD/1X+i2u7wObgozen9T017idwg/CCS9O2gnKbgYvvpEWs8juEFfa9pY12KFlSny +yNuffcjMoUigCgBEsOREmKSnnwfYySbQvDrzTOYboW5+gwWRfZc4CiyDb0KvJadX +hvu1acwcNTfMSlFqMWiy279yBz73ywgIBuQqmcD6F+nmXbPy5ruCEDd6tcWnqgFF +9rZbb5HcgpgES6/EFaI8O5D2R3O4HvbYcoSGZBSmMt3ffMCH17qL2eILnodu86Au +YF5/z/Q4pehuGKaOyRTzplKBOAM2g2FcmhzjzqIf4cPC9ZbjNBex/ELPVmUCAwEA +AaOBhzCBhDAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBTE0AsLEUJZWhvFagpX63pB +9yCi/jAfBgNVHSMEGDAWgBRIh7H/gNQSSCgduN4vOJLwxdvFvDAOBgNVHQ8BAf8E +BAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDwYDVR0RBAgwBocEfwAAATANBgkq +hkiG9w0BAQsFAAOCAQEAiznmYfrc4so69aYDZHAvG6Puz3VHe4UfjacaRy2LgSfX +vrkjY+OhUBGrl7ftEPizsxHGVxpoxuzIo6ft5nM9pMWlGBn7spta+J9inofSPsIa +wkaPJDCNLeB2Nuv9QYFSIugx0s9LIhyR9cHJoQJSre3QvMHCE+maKcP2gba8MRvD +ChtGA1gwQXkI8QxvMTNCH8mhZXCAI331TlP2/OPqdrHRPm57GFKbXziLUv5+TnXy +xxu7qbXSyiJN3Y27Nf/0O5+lJ32Q1H24HqVth34k8Ck2lrWZWbbgQ2e0ophKCpn6 +JCIHHkX82OKW7KsMC9PGAmL8Kcg+JWwyleBR6DZm6A== -----END CERTIFICATE----- diff --git a/nsqd/test/certs/server.req b/nsqd/test/certs/server.req index 1ccec009e..fd73e89d9 100644 --- a/nsqd/test/certs/server.req +++ b/nsqd/test/certs/server.req @@ -1,18 +1,18 @@ -----BEGIN CERTIFICATE REQUEST----- MIICzTCCAbUCAQAwgYcxIzAhBgkqhkiG9w0BCQEWFG1yZWlmZXJzb25AZ21haWwu -Y29tMQswCQYDVQQGEwJERTEMMAoGA1UECBMDTlJXMQ4wDAYDVQQHEwVFYXJ0aDEX -MBUGA1UEChMOUmFuZG9tIENvbXBhbnkxCzAJBgNVBAsTAklUMQ8wDQYDVQQDEwZu -c3EuaW8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC5izs16tildar8 -g9oEauIehuEiz+LgAketrtCFnk38R8EJvQ3ore0jgZEcxniUHQfAg1abFo+zoPbI -MLGkaCeu7qoK7T/3X4ur4YRmP4XPUTbJ8Kq15xPJK9Z/16f5J1MoVlMYYgC7fMVy -jO5fZ92GSMnqJtmGetcqU9Tgg3RJOSRF8Vf7Jv/o/zyYaHs9koFvrtDDVumnNcT9 -JaAdWoOq777CFPWq7DGdGGH9IeDC6A37qIq5MNwnWNDVBZ77GdrtN7qc0FS8vp1X -j2OmgM6Mey/5RoC/M14cIerKlMLTDBgdfKBNMBT4TbRzY04ILs/Q8CJ3WWI1664R -a0zZtGsVAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEASNjcoZbyNcwMQjMmNoil -S/7pCRn4aYzZIVjrVtOHQ9GHC23MSep5um2gIcMFPiuYyu9Byl8CSVtc1op2fAKS -vrugoZaCrp/A76hqOfNxgh7VmgTux8bG5Qcjaija1BNWpbyaWARdBxN/WgS5CpCj -u2yzv8mrzzFNrDMlsmiEMvtkMzdhiZ4YY8zm6CdrbIR5z1eqf4e+rs4oJtTKNNAD -hewk8CGiUW1hOx2jpjcIVMRy+ofVHRX2xQ6Sw8qxCNsiv8IPAAivgAbFJO76ZSbH -eQ7uKWszmBEroyFvZ0rfmFLXuopU125pyBDl5FUKYAZzCBx9tr5dROCbw/rXDhke -ig== +Y29tMQswCQYDVQQGEwJERTEMMAoGA1UECAwDTlJXMQ4wDAYDVQQHDAVFYXJ0aDEX +MBUGA1UECgwOUmFuZG9tIENvbXBhbnkxCzAJBgNVBAsMAklUMQ8wDQYDVQQDDAZu +c3EuaW8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCy/7ebzIezybQE +f0+5RS7XzK7QSlA/9V/otru8Dm4KM3p/U9Ne4ncIPwgkvTtoJym4GL76RFrPI7hB +X2vaWNdihZUp8sjbn33IzKFIoAoARLDkRJikp58H2Mkm0Lw680zmG6FufoMFkX2X +OAosg29CryWnV4b7tWnMHDU3zEpRajFostu/cgc+98sICAbkKpnA+hfp5l2z8ua7 +ghA3erXFp6oBRfa2W2+R3IKYBEuvxBWiPDuQ9kdzuB722HKEhmQUpjLd33zAh9e6 +i9niC56HbvOgLmBef8/0OKXobhimjskU86ZSgTgDNoNhXJoc486iH+HDwvWW4zQX +sfxCz1ZlAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEABjAP5B4FpTeHHwv0MMJB +762uHK2Jkt2Y5QWPqeZLV+E7PvImDFxShG0VRBIrZFu7trVy4J3xysIsEaaPorr/ +NoK4wwgCt3+xk6pJmLqOMDH6Mai0NgBF56fJZP/y9zKxTEGvK8ySJdPgfszNZNII +6XBi0ifsBIHiRPb9VwAdp0hRQZoV9xTLh9Ggy0VRODBrQTSefAosoiyx8ckPn//G +3SEDtTJa1HE0JJDULmxOpJY5OOv8G9iIWV2M2Wn+aDHHZ/Lk3cXg1tmX396T0vL6 +wtbE2qD9QwkANqN+wF2LqCmVSLDBvFxvtTEYPrb8JnQzZgNNJAhz4ZqWpx7KTIzv +pw== -----END CERTIFICATE REQUEST----- diff --git a/nsqd/topic.go b/nsqd/topic.go index 4834c0102..db61c3ba4 100644 --- a/nsqd/topic.go +++ b/nsqd/topic.go @@ -119,7 +119,7 @@ func (t *Topic) getOrCreateChannel(channelName string) (*Channel, bool) { channel, ok := t.channelMap[channelName] if !ok { deleteCallback := func(c *Channel) { - t.DeleteExistingChannel(c.name) + _ = t.DeleteExistingChannel(c.name) } channel = NewChannel(t.name, channelName, t.nsqd, deleteCallback) t.channelMap[channelName] = channel @@ -156,7 +156,10 @@ func (t *Topic) DeleteExistingChannel(channelName string) error { // we do this before removing the channel from map below (with no lock) // so that any incoming subs will error and not create a new channel // to enforce ordering - channel.Delete() + err := channel.Delete() + if err != nil { + return err + } t.Lock() delete(t.channelMap, channelName) @@ -377,12 +380,15 @@ func (t *Topic) exit(deleted bool) error { t.Lock() for _, channel := range t.channelMap { delete(t.channelMap, channel.name) - channel.Delete() + _ = channel.Delete() } t.Unlock() // empty the queue (deletes the backend files, too) - t.Empty() + err := t.Empty() + if err != nil { + return err + } return t.backend.Delete() } @@ -398,7 +404,10 @@ func (t *Topic) exit(deleted bool) error { t.RUnlock() // write anything leftover to disk - t.flush() + err := t.flush() + if err != nil { + return err + } return t.backend.Close() } diff --git a/nsqd/topic_test.go b/nsqd/topic_test.go index d78fceae9..702150a8f 100644 --- a/nsqd/topic_test.go +++ b/nsqd/topic_test.go @@ -18,7 +18,7 @@ func TestGetTopic(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topic1 := nsqd.GetTopic("test") @@ -37,7 +37,7 @@ func TestGetChannel(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topic := nsqd.GetTopic("test") @@ -70,7 +70,7 @@ func TestHealth(t *testing.T) { opts.Logger = test.NewTestLogger(t) opts.MemQueueSize = 2 _, httpAddr, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topic := nsqd.GetTopic("test") @@ -97,7 +97,7 @@ func TestHealth(t *testing.T) { test.Nil(t, err) test.Equal(t, 500, resp.StatusCode) body, _ := io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() test.Equal(t, "NOK - never gonna happen", string(body)) topic.backend = &errorRecoveredBackendQueue{} @@ -110,7 +110,7 @@ func TestHealth(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() test.Equal(t, "OK", string(body)) } @@ -118,7 +118,7 @@ func TestDeletes(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topic := nsqd.GetTopic("test") @@ -143,7 +143,7 @@ func TestDeleteLast(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topic := nsqd.GetTopic("test") @@ -166,7 +166,7 @@ func TestPause(t *testing.T) { opts := NewOptions() opts.Logger = test.NewTestLogger(t) _, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() topicName := "test_topic_pause" + strconv.Itoa(int(time.Now().Unix())) @@ -202,14 +202,14 @@ func BenchmarkTopicPut(b *testing.B) { opts.Logger = test.NewTestLogger(b) opts.MemQueueSize = int64(b.N) _, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() b.StartTimer() for i := 0; i <= b.N; i++ { topic := nsqd.GetTopic(topicName) msg := NewMessage(topic.GenerateID(), []byte("aaaaaaaaaaaaaaaaaaaaaaaaaaa")) - topic.PutMessage(msg) + _ = topic.PutMessage(msg) } } @@ -221,7 +221,7 @@ func BenchmarkTopicToChannelPut(b *testing.B) { opts.Logger = test.NewTestLogger(b) opts.MemQueueSize = int64(b.N) _, _, nsqd := mustStartNSQD(opts) - defer os.RemoveAll(opts.DataPath) + defer func() { _ = os.RemoveAll(opts.DataPath) }() defer nsqd.Exit() channel := nsqd.GetTopic(topicName).GetChannel(channelName) b.StartTimer() @@ -229,13 +229,10 @@ func BenchmarkTopicToChannelPut(b *testing.B) { for i := 0; i <= b.N; i++ { topic := nsqd.GetTopic(topicName) msg := NewMessage(topic.GenerateID(), []byte("aaaaaaaaaaaaaaaaaaaaaaaaaaa")) - topic.PutMessage(msg) + _ = topic.PutMessage(msg) } - for { - if len(channel.memoryMsgChan) == b.N { - break - } + for len(channel.memoryMsgChan) != b.N { runtime.Gosched() } } diff --git a/nsqlookupd/http.go b/nsqlookupd/http.go index d011cbf56..e5493fa64 100644 --- a/nsqlookupd/http.go +++ b/nsqlookupd/http.go @@ -87,12 +87,12 @@ func (s *httpServer) doTopics(w http.ResponseWriter, req *http.Request, ps httpr func (s *httpServer) doChannels(w http.ResponseWriter, req *http.Request, ps httprouter.Params) (interface{}, error) { reqParams, err := http_api.NewReqParams(req) if err != nil { - return nil, http_api.Err{400, "INVALID_REQUEST"} + return nil, http_api.Err{Code: 400, Text: "INVALID_REQUEST"} } topicName, err := reqParams.Get("topic") if err != nil { - return nil, http_api.Err{400, "MISSING_ARG_TOPIC"} + return nil, http_api.Err{Code: 400, Text: "MISSING_ARG_TOPIC"} } channels := s.nsqlookupd.DB.FindRegistrations("channel", topicName, "*").SubKeys() @@ -104,17 +104,17 @@ func (s *httpServer) doChannels(w http.ResponseWriter, req *http.Request, ps htt func (s *httpServer) doLookup(w http.ResponseWriter, req *http.Request, ps httprouter.Params) (interface{}, error) { reqParams, err := http_api.NewReqParams(req) if err != nil { - return nil, http_api.Err{400, "INVALID_REQUEST"} + return nil, http_api.Err{Code: 400, Text: "INVALID_REQUEST"} } topicName, err := reqParams.Get("topic") if err != nil { - return nil, http_api.Err{400, "MISSING_ARG_TOPIC"} + return nil, http_api.Err{Code: 400, Text: "MISSING_ARG_TOPIC"} } registration := s.nsqlookupd.DB.FindRegistrations("topic", topicName, "") if len(registration) == 0 { - return nil, http_api.Err{404, "TOPIC_NOT_FOUND"} + return nil, http_api.Err{Code: 404, Text: "TOPIC_NOT_FOUND"} } channels := s.nsqlookupd.DB.FindRegistrations("channel", topicName, "*").SubKeys() @@ -130,16 +130,16 @@ func (s *httpServer) doLookup(w http.ResponseWriter, req *http.Request, ps httpr func (s *httpServer) doCreateTopic(w http.ResponseWriter, req *http.Request, ps httprouter.Params) (interface{}, error) { reqParams, err := http_api.NewReqParams(req) if err != nil { - return nil, http_api.Err{400, "INVALID_REQUEST"} + return nil, http_api.Err{Code: 400, Text: "INVALID_REQUEST"} } topicName, err := reqParams.Get("topic") if err != nil { - return nil, http_api.Err{400, "MISSING_ARG_TOPIC"} + return nil, http_api.Err{Code: 400, Text: "MISSING_ARG_TOPIC"} } if !protocol.IsValidTopicName(topicName) { - return nil, http_api.Err{400, "INVALID_ARG_TOPIC"} + return nil, http_api.Err{Code: 400, Text: "INVALID_ARG_TOPIC"} } s.nsqlookupd.logf(LOG_INFO, "DB: adding topic(%s)", topicName) @@ -152,12 +152,12 @@ func (s *httpServer) doCreateTopic(w http.ResponseWriter, req *http.Request, ps func (s *httpServer) doDeleteTopic(w http.ResponseWriter, req *http.Request, ps httprouter.Params) (interface{}, error) { reqParams, err := http_api.NewReqParams(req) if err != nil { - return nil, http_api.Err{400, "INVALID_REQUEST"} + return nil, http_api.Err{Code: 400, Text: "INVALID_REQUEST"} } topicName, err := reqParams.Get("topic") if err != nil { - return nil, http_api.Err{400, "MISSING_ARG_TOPIC"} + return nil, http_api.Err{Code: 400, Text: "MISSING_ARG_TOPIC"} } registrations := s.nsqlookupd.DB.FindRegistrations("channel", topicName, "*") @@ -178,17 +178,17 @@ func (s *httpServer) doDeleteTopic(w http.ResponseWriter, req *http.Request, ps func (s *httpServer) doTombstoneTopicProducer(w http.ResponseWriter, req *http.Request, ps httprouter.Params) (interface{}, error) { reqParams, err := http_api.NewReqParams(req) if err != nil { - return nil, http_api.Err{400, "INVALID_REQUEST"} + return nil, http_api.Err{Code: 400, Text: "INVALID_REQUEST"} } topicName, err := reqParams.Get("topic") if err != nil { - return nil, http_api.Err{400, "MISSING_ARG_TOPIC"} + return nil, http_api.Err{Code: 400, Text: "MISSING_ARG_TOPIC"} } node, err := reqParams.Get("node") if err != nil { - return nil, http_api.Err{400, "MISSING_ARG_NODE"} + return nil, http_api.Err{Code: 400, Text: "MISSING_ARG_NODE"} } s.nsqlookupd.logf(LOG_INFO, "DB: setting tombstone for producer@%s of topic(%s)", node, topicName) @@ -206,12 +206,12 @@ func (s *httpServer) doTombstoneTopicProducer(w http.ResponseWriter, req *http.R func (s *httpServer) doCreateChannel(w http.ResponseWriter, req *http.Request, ps httprouter.Params) (interface{}, error) { reqParams, err := http_api.NewReqParams(req) if err != nil { - return nil, http_api.Err{400, "INVALID_REQUEST"} + return nil, http_api.Err{Code: 400, Text: "INVALID_REQUEST"} } topicName, channelName, err := http_api.GetTopicChannelArgs(reqParams) if err != nil { - return nil, http_api.Err{400, err.Error()} + return nil, http_api.Err{Code: 400, Text: err.Error()} } s.nsqlookupd.logf(LOG_INFO, "DB: adding channel(%s) in topic(%s)", channelName, topicName) @@ -228,17 +228,17 @@ func (s *httpServer) doCreateChannel(w http.ResponseWriter, req *http.Request, p func (s *httpServer) doDeleteChannel(w http.ResponseWriter, req *http.Request, ps httprouter.Params) (interface{}, error) { reqParams, err := http_api.NewReqParams(req) if err != nil { - return nil, http_api.Err{400, "INVALID_REQUEST"} + return nil, http_api.Err{Code: 400, Text: "INVALID_REQUEST"} } topicName, channelName, err := http_api.GetTopicChannelArgs(reqParams) if err != nil { - return nil, http_api.Err{400, err.Error()} + return nil, http_api.Err{Code: 400, Text: err.Error()} } registrations := s.nsqlookupd.DB.FindRegistrations("channel", topicName, channelName) if len(registrations) == 0 { - return nil, http_api.Err{404, "CHANNEL_NOT_FOUND"} + return nil, http_api.Err{Code: 404, Text: "CHANNEL_NOT_FOUND"} } s.nsqlookupd.logf(LOG_INFO, "DB: removing channel(%s) from topic(%s)", channelName, topicName) diff --git a/nsqlookupd/http_test.go b/nsqlookupd/http_test.go index 94f17f086..2af8aa662 100644 --- a/nsqlookupd/http_test.go +++ b/nsqlookupd/http_test.go @@ -88,7 +88,7 @@ func makeChannel(nsqlookupd *NSQLookupd, topicName string, channelName string) { func TestPing(t *testing.T) { dataPath, nsqds, nsqlookupd1 := bootstrapNSQCluster(t) - defer os.RemoveAll(dataPath) + defer func() { _ = os.RemoveAll(dataPath) }() defer nsqds[0].Exit() defer nsqlookupd1.Exit() @@ -99,14 +99,15 @@ func TestPing(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ := io.ReadAll(resp.Body) - resp.Body.Close() + err = resp.Body.Close() + test.Nil(t, err) test.Equal(t, []byte("OK"), body) } func TestInfo(t *testing.T) { dataPath, nsqds, nsqlookupd1 := bootstrapNSQCluster(t) - defer os.RemoveAll(dataPath) + defer func() { _ = os.RemoveAll(dataPath) }() defer nsqds[0].Exit() defer nsqlookupd1.Exit() @@ -117,7 +118,8 @@ func TestInfo(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ := io.ReadAll(resp.Body) - resp.Body.Close() + err = resp.Body.Close() + test.Nil(t, err) t.Logf("%s", body) info := InfoDoc{} @@ -128,7 +130,7 @@ func TestInfo(t *testing.T) { func TestCreateTopic(t *testing.T) { dataPath, nsqds, nsqlookupd1 := bootstrapNSQCluster(t) - defer os.RemoveAll(dataPath) + defer func() { _ = os.RemoveAll(dataPath) }() defer nsqds[0].Exit() defer nsqlookupd1.Exit() @@ -142,7 +144,8 @@ func TestCreateTopic(t *testing.T) { test.Equal(t, 400, resp.StatusCode) test.Equal(t, "Bad Request", http.StatusText(resp.StatusCode)) body, _ := io.ReadAll(resp.Body) - resp.Body.Close() + err = resp.Body.Close() + test.Nil(t, err) t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -158,7 +161,7 @@ func TestCreateTopic(t *testing.T) { test.Equal(t, 400, resp.StatusCode) test.Equal(t, "Bad Request", http.StatusText(resp.StatusCode)) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -173,7 +176,7 @@ func TestCreateTopic(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) test.Equal(t, []byte(""), body) @@ -181,7 +184,7 @@ func TestCreateTopic(t *testing.T) { func TestDeleteTopic(t *testing.T) { dataPath, nsqds, nsqlookupd1 := bootstrapNSQCluster(t) - defer os.RemoveAll(dataPath) + defer func() { _ = os.RemoveAll(dataPath) }() defer nsqds[0].Exit() defer nsqlookupd1.Exit() @@ -195,7 +198,7 @@ func TestDeleteTopic(t *testing.T) { test.Equal(t, 400, resp.StatusCode) test.Equal(t, "Bad Request", http.StatusText(resp.StatusCode)) body, _ := io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -212,7 +215,7 @@ func TestDeleteTopic(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) test.Equal(t, []byte(""), body) @@ -228,7 +231,7 @@ func TestDeleteTopic(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) test.Equal(t, []byte(""), body) @@ -236,7 +239,7 @@ func TestDeleteTopic(t *testing.T) { func TestGetChannels(t *testing.T) { dataPath, nsqds, nsqlookupd1 := bootstrapNSQCluster(t) - defer os.RemoveAll(dataPath) + defer func() { _ = os.RemoveAll(dataPath) }() defer nsqds[0].Exit() defer nsqlookupd1.Exit() @@ -251,7 +254,7 @@ func TestGetChannels(t *testing.T) { test.Equal(t, 400, resp.StatusCode) test.Equal(t, "Bad Request", http.StatusText(resp.StatusCode)) body, _ := io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -270,7 +273,7 @@ func TestGetChannels(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &ch) @@ -289,7 +292,7 @@ func TestGetChannels(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &ch) @@ -300,7 +303,7 @@ func TestGetChannels(t *testing.T) { func TestCreateChannel(t *testing.T) { dataPath, nsqds, nsqlookupd1 := bootstrapNSQCluster(t) - defer os.RemoveAll(dataPath) + defer func() { _ = os.RemoveAll(dataPath) }() defer nsqds[0].Exit() defer nsqlookupd1.Exit() @@ -314,7 +317,7 @@ func TestCreateChannel(t *testing.T) { test.Equal(t, 400, resp.StatusCode) test.Equal(t, "Bad Request", http.StatusText(resp.StatusCode)) body, _ := io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -330,7 +333,7 @@ func TestCreateChannel(t *testing.T) { test.Equal(t, 400, resp.StatusCode) test.Equal(t, "Bad Request", http.StatusText(resp.StatusCode)) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -346,7 +349,7 @@ func TestCreateChannel(t *testing.T) { test.Equal(t, 400, resp.StatusCode) test.Equal(t, "Bad Request", http.StatusText(resp.StatusCode)) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -362,7 +365,7 @@ func TestCreateChannel(t *testing.T) { test.Equal(t, 400, resp.StatusCode) test.Equal(t, "Bad Request", http.StatusText(resp.StatusCode)) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -377,7 +380,7 @@ func TestCreateChannel(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) test.Equal(t, []byte(""), body) @@ -385,7 +388,7 @@ func TestCreateChannel(t *testing.T) { func TestDeleteChannel(t *testing.T) { dataPath, nsqds, nsqlookupd1 := bootstrapNSQCluster(t) - defer os.RemoveAll(dataPath) + defer func() { _ = os.RemoveAll(dataPath) }() defer nsqds[0].Exit() defer nsqlookupd1.Exit() @@ -399,7 +402,7 @@ func TestDeleteChannel(t *testing.T) { test.Equal(t, 400, resp.StatusCode) test.Equal(t, "Bad Request", http.StatusText(resp.StatusCode)) body, _ := io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -415,7 +418,7 @@ func TestDeleteChannel(t *testing.T) { test.Equal(t, 400, resp.StatusCode) test.Equal(t, "Bad Request", http.StatusText(resp.StatusCode)) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -431,7 +434,7 @@ func TestDeleteChannel(t *testing.T) { test.Equal(t, 400, resp.StatusCode) test.Equal(t, "Bad Request", http.StatusText(resp.StatusCode)) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -447,7 +450,7 @@ func TestDeleteChannel(t *testing.T) { test.Equal(t, 400, resp.StatusCode) test.Equal(t, "Bad Request", http.StatusText(resp.StatusCode)) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -463,7 +466,7 @@ func TestDeleteChannel(t *testing.T) { test.Equal(t, 404, resp.StatusCode) test.Equal(t, "Not Found", http.StatusText(resp.StatusCode)) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) err = json.Unmarshal(body, &em) @@ -477,7 +480,7 @@ func TestDeleteChannel(t *testing.T) { test.Nil(t, err) test.Equal(t, 200, resp.StatusCode) body, _ = io.ReadAll(resp.Body) - resp.Body.Close() + _ = resp.Body.Close() t.Logf("%s", body) test.Equal(t, []byte(""), body) diff --git a/nsqlookupd/nsqlookupd.go b/nsqlookupd/nsqlookupd.go index 0996d087a..e86a802ae 100644 --- a/nsqlookupd/nsqlookupd.go +++ b/nsqlookupd/nsqlookupd.go @@ -85,7 +85,9 @@ func (l *NSQLookupd) RealHTTPAddr() *net.TCPAddr { func (l *NSQLookupd) Exit() { if l.tcpListener != nil { - l.tcpListener.Close() + if err := l.tcpListener.Close(); err != nil { + l.logf(LOG_ERROR, "failed to close TCP listener - %s", err) + } } if l.tcpServer != nil { @@ -93,7 +95,9 @@ func (l *NSQLookupd) Exit() { } if l.httpListener != nil { - l.httpListener.Close() + if err := l.httpListener.Close(); err != nil { + l.logf(LOG_ERROR, "failed to close HTTP listener - %s", err) + } } l.waitGroup.Wait() } diff --git a/nsqlookupd/nsqlookupd_test.go b/nsqlookupd/nsqlookupd_test.go index 6afb18906..bc0e605fd 100644 --- a/nsqlookupd/nsqlookupd_test.go +++ b/nsqlookupd/nsqlookupd_test.go @@ -55,7 +55,8 @@ func mustConnectLookupd(t *testing.T, tcpAddr *net.TCPAddr) net.Conn { if err != nil { t.Fatal("failed to connect to lookupd") } - conn.Write(nsq.MagicV1) + _, err = conn.Write(nsq.MagicV1) + test.Nil(t, err) return conn } @@ -88,7 +89,8 @@ func TestBasicLookupd(t *testing.T) { identify(t, conn) - nsq.Register(topicName, "channel1").WriteTo(conn) + _, err := nsq.Register(topicName, "channel1").WriteTo(conn) + test.Nil(t, err) v, err := nsq.ReadResponse(conn) test.Nil(t, err) test.Equal(t, []byte("OK"), v) @@ -136,7 +138,8 @@ func TestBasicLookupd(t *testing.T) { test.Equal(t, NSQDVersion, p.Version) } - conn.Close() + err = conn.Close() + test.Nil(t, err) time.Sleep(10 * time.Millisecond) // now there should be no producers, but still topic/channel entries @@ -159,11 +162,12 @@ func TestChannelUnregister(t *testing.T) { topicName := "channel_unregister" conn := mustConnectLookupd(t, tcpAddr) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn) - nsq.Register(topicName, "ch1").WriteTo(conn) + _, err := nsq.Register(topicName, "ch1").WriteTo(conn) + test.Nil(t, err) v, err := nsq.ReadResponse(conn) test.Nil(t, err) test.Equal(t, []byte("OK"), v) @@ -174,7 +178,8 @@ func TestChannelUnregister(t *testing.T) { channels := nsqlookupd.DB.FindRegistrations("channel", topicName, "*") test.Equal(t, 1, len(channels)) - nsq.UnRegister(topicName, "ch1").WriteTo(conn) + _, err = nsq.UnRegister(topicName, "ch1").WriteTo(conn) + test.Nil(t, err) v, err = nsq.ReadResponse(conn) test.Nil(t, err) test.Equal(t, []byte("OK"), v) @@ -206,15 +211,17 @@ func TestTombstoneRecover(t *testing.T) { topicName2 := topicName + "2" conn := mustConnectLookupd(t, tcpAddr) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn) - nsq.Register(topicName, "channel1").WriteTo(conn) - _, err := nsq.ReadResponse(conn) + _, err := nsq.Register(topicName, "channel1").WriteTo(conn) + test.Nil(t, err) + _, err = nsq.ReadResponse(conn) test.Nil(t, err) - nsq.Register(topicName2, "channel2").WriteTo(conn) + _, err = nsq.Register(topicName2, "channel2").WriteTo(conn) + test.Nil(t, err) _, err = nsq.ReadResponse(conn) test.Nil(t, err) @@ -253,12 +260,13 @@ func TestTombstoneUnregister(t *testing.T) { topicName := "tombstone_unregister" conn := mustConnectLookupd(t, tcpAddr) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn) - nsq.Register(topicName, "channel1").WriteTo(conn) - _, err := nsq.ReadResponse(conn) + _, err := nsq.Register(topicName, "channel1").WriteTo(conn) + test.Nil(t, err) + _, err = nsq.ReadResponse(conn) test.Nil(t, err) endpoint := fmt.Sprintf("http://%s/topic/tombstone?topic=%s&node=%s:%d", @@ -273,7 +281,8 @@ func TestTombstoneUnregister(t *testing.T) { test.Nil(t, err) test.Equal(t, 0, len(pr.Producers)) - nsq.UnRegister(topicName, "").WriteTo(conn) + _, err = nsq.UnRegister(topicName, "").WriteTo(conn) + test.Nil(t, err) _, err = nsq.ReadResponse(conn) test.Nil(t, err) @@ -297,12 +306,13 @@ func TestInactiveNodes(t *testing.T) { topicName := "inactive_nodes" conn := mustConnectLookupd(t, tcpAddr) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn) - nsq.Register(topicName, "channel1").WriteTo(conn) - _, err := nsq.ReadResponse(conn) + _, err := nsq.Register(topicName, "channel1").WriteTo(conn) + test.Nil(t, err) + _, err = nsq.ReadResponse(conn) test.Nil(t, err) ci := clusterinfo.New(nil, http_api.NewClient(nil, ConnectTimeout, RequestTimeout)) @@ -330,12 +340,13 @@ func TestTombstonedNodes(t *testing.T) { topicName := "inactive_nodes" conn := mustConnectLookupd(t, tcpAddr) - defer conn.Close() + defer func() { _ = conn.Close() }() identify(t, conn) - nsq.Register(topicName, "channel1").WriteTo(conn) - _, err := nsq.ReadResponse(conn) + _, err := nsq.Register(topicName, "channel1").WriteTo(conn) + test.Nil(t, err) + _, err = nsq.ReadResponse(conn) test.Nil(t, err) ci := clusterinfo.New(nil, http_api.NewClient(nil, ConnectTimeout, RequestTimeout)) diff --git a/nsqlookupd/tcp.go b/nsqlookupd/tcp.go index d57a7b353..b370d2660 100644 --- a/nsqlookupd/tcp.go +++ b/nsqlookupd/tcp.go @@ -23,7 +23,7 @@ func (p *tcpServer) Handle(conn net.Conn) { _, err := io.ReadFull(conn, buf) if err != nil { p.nsqlookupd.logf(LOG_ERROR, "failed to read protocol version - %s", err) - conn.Close() + _ = conn.Close() return } protocolMagic := string(buf) @@ -36,8 +36,12 @@ func (p *tcpServer) Handle(conn net.Conn) { case " V1": prot = &LookupProtocolV1{nsqlookupd: p.nsqlookupd} default: - protocol.SendResponse(conn, []byte("E_BAD_PROTOCOL")) - conn.Close() + if _, err := protocol.SendResponse(conn, []byte("E_BAD_PROTOCOL")); err != nil { + p.nsqlookupd.logf(LOG_ERROR, "failed to send bad protocol response to client(%s) - %s", conn.RemoteAddr(), err) + } + if err := conn.Close(); err != nil { + p.nsqlookupd.logf(LOG_ERROR, "failed to close client(%s) connection - %s", conn.RemoteAddr(), err) + } p.nsqlookupd.logf(LOG_ERROR, "client(%s) bad protocol magic '%s'", conn.RemoteAddr(), protocolMagic) return @@ -52,12 +56,16 @@ func (p *tcpServer) Handle(conn net.Conn) { } p.conns.Delete(conn.RemoteAddr()) - client.Close() + if err := client.Close(); err != nil { + p.nsqlookupd.logf(LOG_ERROR, "failed to close client(%s) - %s", conn.RemoteAddr(), err) + } } func (p *tcpServer) Close() { p.conns.Range(func(k, v interface{}) bool { - v.(protocol.Client).Close() + if err := v.(protocol.Client).Close(); err != nil { + p.nsqlookupd.logf(LOG_ERROR, "failed to close client(%s) - %s", k, err) + } return true }) } diff --git a/test.sh b/test.sh index 9e0850bcf..5874b6a15 100755 --- a/test.sh +++ b/test.sh @@ -1,7 +1,7 @@ #!/bin/sh set -e -GOMAXPROCS=1 go test -timeout 90s ./... +GOMAXPROCS=1 go test -vet=all -timeout 90s ./... if [ "$GOARCH" = "amd64" ] || [ "$GOARCH" = "arm64" ]; then # go test: -race is only supported on linux/amd64, linux/ppc64le, @@ -20,9 +20,6 @@ for dir in apps/*/ bench/*/; do fi done -# disable "composite literal uses unkeyed fields" -go vet -composites=false ./... - FMTDIFF="$(find apps internal nsqd nsqlookupd -name '*.go' -exec gofmt -d '{}' ';')" if [ -n "$FMTDIFF" ]; then printf '%s\n' "$FMTDIFF"