diff --git a/Makefile.common b/Makefile.common index 741579e60..fff85f922 100644 --- a/Makefile.common +++ b/Makefile.common @@ -29,6 +29,8 @@ GO ?= go GOFMT ?= $(GO)fmt FIRST_GOPATH := $(firstword $(subst :, ,$(shell $(GO) env GOPATH))) GOOPTS ?= +GOHOSTOS ?= $(shell $(GO) env GOHOSTOS) +GOHOSTARCH ?= $(shell $(GO) env GOHOSTARCH) GO_VERSION ?= $(shell $(GO) version) GO_VERSION_NUMBER ?= $(word 3, $(GO_VERSION)) @@ -62,17 +64,30 @@ PROMU := $(FIRST_GOPATH)/bin/promu STATICCHECK := $(FIRST_GOPATH)/bin/staticcheck pkgs = ./... -GO_VERSION ?= $(shell $(GO) version) -GO_BUILD_PLATFORM ?= $(subst /,-,$(lastword $(GO_VERSION))) +ifeq (arm, $(GOHOSTARCH)) + GOHOSTARM ?= $(shell GOARM= $(GO) env GOARM) + GO_BUILD_PLATFORM ?= $(GOHOSTOS)-$(GOHOSTARCH)v$(GOHOSTARM) +else + GO_BUILD_PLATFORM ?= $(GOHOSTOS)-$(GOHOSTARCH) +endif PROMU_VERSION ?= 0.2.0 PROMU_URL := https://github.com/prometheus/promu/releases/download/v$(PROMU_VERSION)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM).tar.gz +STATICCHECK_VERSION ?= 2019.1 +STATICCHECK_URL := https://github.com/dominikh/go-tools/releases/download/$(STATICCHECK_VERSION)/staticcheck_$(GOHOSTOS)_$(GOHOSTARCH) PREFIX ?= $(shell pwd) BIN_DIR ?= $(shell pwd) DOCKER_IMAGE_TAG ?= $(subst /,-,$(shell git rev-parse --abbrev-ref HEAD)) DOCKER_REPO ?= prom +ifeq ($(GOHOSTARCH),amd64) + ifeq ($(GOHOSTOS),$(filter $(GOHOSTOS),linux freebsd darwin windows)) + # Only supported on amd64 + test-flags := -race + endif +endif + .PHONY: all all: precheck style staticcheck unused build test @@ -110,12 +125,12 @@ common-test-short: .PHONY: common-test common-test: @echo ">> running all tests" - GO111MODULE=$(GO111MODULE) $(GO) test -race $(GOOPTS) $(pkgs) + GO111MODULE=$(GO111MODULE) $(GO) test $(test-flags) $(GOOPTS) $(pkgs) .PHONY: common-format common-format: @echo ">> formatting code" - GO111MODULE=$(GO111MODULE) $(GO) fmt $(GOOPTS) $(pkgs) + GO111MODULE=$(GO111MODULE) $(GO) fmt $(pkgs) .PHONY: common-vet common-vet: @@ -125,8 +140,12 @@ common-vet: .PHONY: common-staticcheck common-staticcheck: $(STATICCHECK) @echo ">> running staticcheck" + chmod +x $(STATICCHECK) ifdef GO111MODULE - GO111MODULE=$(GO111MODULE) $(STATICCHECK) -ignore "$(STATICCHECK_IGNORE)" -checks "SA*" $(pkgs) +# 'go list' needs to be executed before staticcheck to prepopulate the modules cache. +# Otherwise staticcheck might fail randomly for some reason not yet explained. + GO111MODULE=$(GO111MODULE) $(GO) list -e -compiled -test=true -export=false -deps=true -find=false -tags= -- ./... > /dev/null + GO111MODULE=$(GO111MODULE) $(STATICCHECK) -ignore "$(STATICCHECK_IGNORE)" $(pkgs) else $(STATICCHECK) -ignore "$(STATICCHECK_IGNORE)" $(pkgs) endif @@ -140,8 +159,9 @@ else ifdef GO111MODULE @echo ">> running check for unused/missing packages in go.mod" GO111MODULE=$(GO111MODULE) $(GO) mod tidy +ifeq (,$(wildcard vendor)) @git diff --exit-code -- go.sum go.mod -ifneq (,$(wildcard vendor)) +else @echo ">> running check for unused packages in vendor/" GO111MODULE=$(GO111MODULE) $(GO) mod vendor @git diff --exit-code -- go.sum go.mod vendor/ @@ -175,30 +195,20 @@ common-docker-tag-latest: promu: $(PROMU) $(PROMU): - curl -s -L $(PROMU_URL) | tar -xvz -C /tmp - mkdir -v -p $(FIRST_GOPATH)/bin - cp -v /tmp/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM)/promu $(PROMU) + $(eval PROMU_TMP := $(shell mktemp -d)) + curl -s -L $(PROMU_URL) | tar -xvzf - -C $(PROMU_TMP) + mkdir -p $(FIRST_GOPATH)/bin + cp $(PROMU_TMP)/promu-$(PROMU_VERSION).$(GO_BUILD_PLATFORM)/promu $(FIRST_GOPATH)/bin/promu + rm -r $(PROMU_TMP) .PHONY: proto proto: @echo ">> generating code from proto files" @./scripts/genproto.sh -.PHONY: $(STATICCHECK) $(STATICCHECK): -ifdef GO111MODULE -# Get staticcheck from a temporary directory to avoid modifying the local go.{mod,sum}. -# See https://github.com/golang/go/issues/27643. -# For now, we are using the next branch of staticcheck because master isn't compatible yet with Go modules. - tmpModule=$$(mktemp -d 2>&1) && \ - mkdir -p $${tmpModule}/staticcheck && \ - cd "$${tmpModule}"/staticcheck && \ - GO111MODULE=on $(GO) mod init example.com/staticcheck && \ - GO111MODULE=on GOOS= GOARCH= $(GO) get -u honnef.co/go/tools/cmd/staticcheck@next && \ - rm -rf $${tmpModule}; -else - GOOS= GOARCH= GO111MODULE=off $(GO) get -u honnef.co/go/tools/cmd/staticcheck -endif + mkdir -p $(FIRST_GOPATH)/bin + curl -s -L $(STATICCHECK_URL) > $(STATICCHECK) ifdef GOVENDOR .PHONY: $(GOVENDOR) diff --git a/chunkenc/bstream.go b/chunkenc/bstream.go index ef04d44ba..72368dcf4 100644 --- a/chunkenc/bstream.go +++ b/chunkenc/bstream.go @@ -39,6 +39,8 @@ // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +//lint:file-ignore U1000 Ignore all unused code. + package chunkenc import "io" diff --git a/chunkenc/chunk_test.go b/chunkenc/chunk_test.go index edabd749f..45eb40cf5 100644 --- a/chunkenc/chunk_test.go +++ b/chunkenc/chunk_test.go @@ -32,7 +32,7 @@ func TestChunk(t *testing.T) { for enc, nc := range map[Encoding]func() Chunk{ EncXOR: func() Chunk { return NewXORChunk() }, } { - t.Run(fmt.Sprintf("%s", enc), func(t *testing.T) { + t.Run(fmt.Sprintf("%d", enc), func(t *testing.T) { for range make([]struct{}, 1) { c := nc() if err := testChunk(c); err != nil { diff --git a/chunks/chunks.go b/chunks/chunks.go index 5eab23982..11278e0b9 100644 --- a/chunks/chunks.go +++ b/chunks/chunks.go @@ -64,9 +64,7 @@ func (cm *Meta) OverlapsClosedInterval(mint, maxt int64) bool { } var ( - errInvalidSize = fmt.Errorf("invalid size") - errInvalidFlag = fmt.Errorf("invalid flag") - errInvalidChecksum = fmt.Errorf("invalid checksum") + errInvalidSize = fmt.Errorf("invalid size") ) var castagnoliTable *crc32.Table diff --git a/cmd/tsdb/main.go b/cmd/tsdb/main.go index 01d85d590..01a2858f1 100644 --- a/cmd/tsdb/main.go +++ b/cmd/tsdb/main.go @@ -87,7 +87,7 @@ func main() { block = blocks[len(blocks)-1] } if block == nil { - exitWithError(fmt.Errorf("Block not found")) + exitWithError(fmt.Errorf("block not found")) } analyzeBlock(block, *analyzeLimit) } @@ -340,12 +340,6 @@ func measureTime(stage string, f func()) time.Duration { return time.Since(start) } -func mapToLabels(m map[string]interface{}, l *labels.Labels) { - for k, v := range m { - *l = append(*l, labels.Label{Name: k, Value: v.(string)}) - } -} - func readPrometheusLabels(r io.Reader, n int) ([]labels.Labels, error) { scanner := bufio.NewScanner(r) diff --git a/compact.go b/compact.go index f8e6ff545..ef31ec887 100644 --- a/compact.go +++ b/compact.go @@ -66,7 +66,6 @@ type Compactor interface { // LeveledCompactor implements the Compactor interface. type LeveledCompactor struct { - dir string metrics *compactorMetrics logger log.Logger ranges []int64 diff --git a/db_test.go b/db_test.go index 92d487eec..f835fc8d0 100644 --- a/db_test.go +++ b/db_test.go @@ -514,8 +514,6 @@ func TestDB_e2e(t *testing.T) { numDatapoints = 1000 numRanges = 1000 timeInterval = int64(3) - maxTime = int64(2 * 1000) - minTime = int64(200) ) // Create 8 series with 1000 data-points of different ranges and run queries. lbls := [][]labels.Label{ @@ -666,8 +664,6 @@ func TestDB_e2e(t *testing.T) { q.Close() } } - - return } func TestWALFlushedOnDBClose(t *testing.T) { diff --git a/encoding_helpers.go b/encoding_helpers.go index 6dd6e7c2e..38ce1f202 100644 --- a/encoding_helpers.go +++ b/encoding_helpers.go @@ -11,6 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +//lint:file-ignore U1000 Ignore all unused code. + package tsdb import ( diff --git a/fileutil/fileutil.go b/fileutil/fileutil.go index 677df8c09..154fa1844 100644 --- a/fileutil/fileutil.go +++ b/fileutil/fileutil.go @@ -77,9 +77,8 @@ func copyFile(src, dest string) error { // returns relative paths to all files and empty directories. func readDirs(src string) ([]string, error) { var files []string - var err error - err = filepath.Walk(src, func(path string, f os.FileInfo, err error) error { + err := filepath.Walk(src, func(path string, f os.FileInfo, err error) error { relativePath := strings.TrimPrefix(path, src) if len(relativePath) > 0 { files = append(files, relativePath) diff --git a/head.go b/head.go index cbc8661f8..8f22d2ba6 100644 --- a/head.go +++ b/head.go @@ -1628,11 +1628,6 @@ func (ss stringset) set(s string) { ss[s] = struct{}{} } -func (ss stringset) has(s string) bool { - _, ok := ss[s] - return ok -} - func (ss stringset) String() string { return strings.Join(ss.slice(), ",") } diff --git a/head_test.go b/head_test.go index 8781f677a..1bbec5e2a 100644 --- a/head_test.go +++ b/head_test.go @@ -584,7 +584,6 @@ func TestDelete_e2e(t *testing.T) { } } } - return } func boundedSamples(full []sample, mint, maxt int64) []sample { diff --git a/index/encoding_helpers.go b/index/encoding_helpers.go index 602498f11..9076dd3d3 100644 --- a/index/encoding_helpers.go +++ b/index/encoding_helpers.go @@ -11,6 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +//lint:file-ignore U1000 Ignore all unused code. + package index import ( diff --git a/index/index.go b/index/index.go index 6413a9fca..0a976187d 100644 --- a/index/index.go +++ b/index/index.go @@ -36,7 +36,6 @@ const ( // MagicIndex 4 bytes at the head of an index file. MagicIndex = 0xBAAAD700 - indexFormatV1 = 1 indexFormatV2 = 2 labelNameSeperator = "\xff" @@ -346,8 +345,6 @@ func (w *Writer) AddSymbols(sym map[string]struct{}) error { } sort.Strings(symbols) - const headerSize = 4 - w.buf1.reset() w.buf2.reset() @@ -563,7 +560,6 @@ type Reader struct { var ( errInvalidSize = fmt.Errorf("invalid size") - errInvalidFlag = fmt.Errorf("invalid flag") errInvalidChecksum = fmt.Errorf("invalid checksum") ) diff --git a/index/postings.go b/index/postings.go index 13df1c69a..6212d07b4 100644 --- a/index/postings.go +++ b/index/postings.go @@ -305,9 +305,8 @@ func Intersect(its ...Postings) Postings { } type intersectPostings struct { - a, b Postings - aok, bok bool - cur uint64 + a, b Postings + cur uint64 } func newIntersectPostings(a, b Postings) *intersectPostings { diff --git a/index/postings_test.go b/index/postings_test.go index 54c37f480..668ec3609 100644 --- a/index/postings_test.go +++ b/index/postings_test.go @@ -61,18 +61,6 @@ func TestMemPostings_ensureOrder(t *testing.T) { } } -type mockPostings struct { - next func() bool - seek func(uint64) bool - value func() uint64 - err func() error -} - -func (m *mockPostings) Next() bool { return m.next() } -func (m *mockPostings) Seek(v uint64) bool { return m.seek(v) } -func (m *mockPostings) Value() uint64 { return m.value() } -func (m *mockPostings) Err() error { return m.err() } - func TestIntersect(t *testing.T) { var cases = []struct { a, b []uint64 @@ -300,8 +288,6 @@ func TestMergedPostingsSeek(t *testing.T) { testutil.Equals(t, c.res, lst) } } - - return } func TestRemovedPostings(t *testing.T) { @@ -463,8 +449,6 @@ func TestRemovedPostingsSeek(t *testing.T) { testutil.Equals(t, c.res, lst) } } - - return } func TestBigEndian(t *testing.T) { diff --git a/querier_test.go b/querier_test.go index 79dfbff7a..79daa5c01 100644 --- a/querier_test.go +++ b/querier_test.go @@ -56,18 +56,6 @@ func newMockSeriesSet(list []Series) *mockSeriesSet { } } -type mockSeriesIterator struct { - seek func(int64) bool - at func() (int64, float64) - next func() bool - err func() error -} - -func (m *mockSeriesIterator) Seek(t int64) bool { return m.seek(t) } -func (m *mockSeriesIterator) At() (int64, float64) { return m.at() } -func (m *mockSeriesIterator) Next() bool { return m.next() } -func (m *mockSeriesIterator) Err() error { return m.err() } - type mockSeries struct { labels func() labels.Labels iterator func() SeriesIterator @@ -451,8 +439,6 @@ Outer: testutil.Equals(t, smplExp, smplRes) } } - - return } func TestBlockQuerierDelete(t *testing.T) { @@ -615,8 +601,6 @@ Outer: testutil.Equals(t, smplExp, smplRes) } } - - return } func TestBaseChunkSeries(t *testing.T) { @@ -713,8 +697,6 @@ func TestBaseChunkSeries(t *testing.T) { testutil.Equals(t, len(tc.expIdxs), i) testutil.Ok(t, bcs.Err()) } - - return } // TODO: Remove after simpleSeries is merged @@ -1038,8 +1020,6 @@ func TestSeriesIterator(t *testing.T) { } }) }) - - return } // Regression for: https://github.com/prometheus/tsdb/pull/97 @@ -1140,7 +1120,6 @@ func TestPopulatedCSReturnsValidChunkSlice(t *testing.T) { maxt: 15, } testutil.Assert(t, p.Next() == false, "") - return } type mockChunkSeriesSet struct { diff --git a/staticcheck.conf b/staticcheck.conf deleted file mode 100644 index 3266a2e29..000000000 --- a/staticcheck.conf +++ /dev/null @@ -1,2 +0,0 @@ -# Enable only "legacy" staticcheck verifications. -checks = [ "SA*" ] diff --git a/tombstones_test.go b/tombstones_test.go index e12574f11..5bc1a7f2d 100644 --- a/tombstones_test.go +++ b/tombstones_test.go @@ -120,7 +120,6 @@ func TestAddingNewIntervals(t *testing.T) { testutil.Equals(t, c.exp, c.exist.add(c.new)) } - return } // TestMemTombstonesConcurrency to make sure they are safe to access from different goroutines.