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