Merge pull request #181 from prometheus/gcchunk

Fix dangling chunk reference panic
This commit is contained in:
Fabian Reinartz 2017-10-25 09:30:16 +02:00 committed by GitHub
commit 820bd8b170
2 changed files with 17 additions and 0 deletions

View file

@ -69,6 +69,17 @@ type Iterator interface {
Next() bool Next() bool
} }
// NewNopIterator returns a new chunk iterator that does not hold any data.
func NewNopIterator() Iterator {
return nopIterator{}
}
type nopIterator struct{}
func (nopIterator) At() (int64, float64) { return 0, 0 }
func (nopIterator) Next() bool { return false }
func (nopIterator) Err() error { return nil }
type Pool interface { type Pool interface {
Put(Chunk) error Put(Chunk) error
Get(e Encoding, b []byte) (Chunk, error) Get(e Encoding, b []byte) (Chunk, error)

View file

@ -1270,6 +1270,12 @@ func computeChunkEndTime(start, cur, max int64) int64 {
func (s *memSeries) iterator(id int) chunks.Iterator { func (s *memSeries) iterator(id int) chunks.Iterator {
c := s.chunk(id) c := s.chunk(id)
// TODO(fabxc): Work around! A querier may have retrieved a pointer to a series' chunk,
// which got then garbage collected before it got accessed.
// We must ensure to not garbage collect as long as any readers still hold a reference.
if c == nil {
return chunks.NewNopIterator()
}
if id-s.firstChunkID < len(s.chunks)-1 { if id-s.firstChunkID < len(s.chunks)-1 {
return c.chunk.Iterator() return c.chunk.Iterator()