From fc389b6ab5bcc58da38d57f1c452519d71701937 Mon Sep 17 00:00:00 2001 From: Edward Welch <edward.welch@grafana.com> Date: Thu, 2 May 2019 12:29:01 -0400 Subject: [PATCH] don't delete elements from a map while iterating over it improve locking of positions --- pkg/promtail/positions/positions.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/pkg/promtail/positions/positions.go b/pkg/promtail/positions/positions.go index cd6c501a..b1e325e7 100644 --- a/pkg/promtail/positions/positions.go +++ b/pkg/promtail/positions/positions.go @@ -84,8 +84,12 @@ func (p *Positions) Get(path string) int64 { // Remove removes the position tracking for a filepath func (p *Positions) Remove(path string) { p.mtx.Lock() + defer p.mtx.Unlock() + p.remove(path) +} + +func (p *Positions) remove(path string) { delete(p.positions, path) - p.mtx.Unlock() } // SyncPeriod returns how often the positions file gets resynced @@ -126,11 +130,14 @@ func (p *Positions) save() { } func (p *Positions) cleanup() { + p.mtx.Lock() + defer p.mtx.Unlock() + toRemove := []string{} for k := range p.positions { if _, err := os.Stat(k); err != nil { if os.IsNotExist(err) { // File no longer exists. - p.Remove(k) + toRemove = append(toRemove, k) return } // Can't determine if file exists or not, some other error. @@ -139,6 +146,9 @@ func (p *Positions) cleanup() { } } + for _, tr := range toRemove { + p.remove(tr) + } } func readPositionsFile(filename string) (map[string]int64, error) { -- GitLab