diff --git a/.promu.yml b/.promu.yml index 27aa3aaed..d4ec92803 100644 --- a/.promu.yml +++ b/.promu.yml @@ -1,3 +1,4 @@ +go: 1.7.1 repository: path: github.com/prometheus/prometheus build: diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a6c00035..3e399132c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.2.1 / 2016-10-10 + +* [BUGFIX] Count chunk evictions properly so that the server doesn't + assume it runs out of memory and subsequencly throttles ingestion. +* [BUGFIX] Use Go1.7.1 for prebuilt binaries to fix issues on MacOS Sierra. + ## 1.2.0 / 2016-10-07 * [FEATURE] Cleaner encoding of query parameters in `/graph` URLs. diff --git a/VERSION b/VERSION index 26aaba0e8..6085e9465 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.2.0 +1.2.1 diff --git a/storage/local/chunk/chunk.go b/storage/local/chunk/chunk.go index 738e678f1..11c42b39d 100644 --- a/storage/local/chunk/chunk.go +++ b/storage/local/chunk/chunk.go @@ -252,6 +252,8 @@ func (d *Desc) MaybeEvict() bool { panic("ChunkLastTime not populated for evicted chunk") } d.C = nil + Ops.WithLabelValues(Evict).Inc() + atomic.AddInt64(&NumMemChunks, -1) return true } diff --git a/storage/local/storage_test.go b/storage/local/storage_test.go index ce7ed2bd6..e3b31620b 100644 --- a/storage/local/storage_test.go +++ b/storage/local/storage_test.go @@ -20,6 +20,7 @@ import ( "math/rand" "os" "strconv" + "sync/atomic" "testing" "testing/quick" "time" @@ -1412,6 +1413,10 @@ func testEvictAndLoadChunkDescs(t *testing.T, encoding chunk.Encoding) { Value: model.SampleValue(3.14), } + // Sadly, chunk.NumMemChunks is a global variable. We have to reset it + // explicitly here. + atomic.StoreInt64(&chunk.NumMemChunks, 0) + s, closer := NewTestStorage(t, encoding) defer closer.Close() @@ -1441,6 +1446,9 @@ func testEvictAndLoadChunkDescs(t *testing.T, encoding chunk.Encoding) { if oldLen <= len(series.chunkDescs) { t.Errorf("Expected number of chunkDescs to decrease, old number %d, current number %d.", oldLen, len(series.chunkDescs)) } + if int64(len(series.chunkDescs)) < atomic.LoadInt64(&chunk.NumMemChunks) { + t.Errorf("NumMemChunks is larger than number of chunk descs, number of chunk descs: %d, NumMemChunks: %d.", len(series.chunkDescs), atomic.LoadInt64(&chunk.NumMemChunks)) + } // Load everything back. it := s.preloadChunksForRange(makeFingerprintSeriesPair(s, fp), 0, 100000)