diff --git a/pkg/promtail/positions/positions.go b/pkg/promtail/positions/positions.go
index cd6c501a67ac3be455f7eb40c9e41424708ae55d..b1e325e711d244519a4d39c69c1883450c964b6a 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) {