Skip to content

Commit ba22265

Browse files
committed
Fix panic when doing list and delete in parallel
... using fs.List method
1 parent 695a0cc commit ba22265

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

pbm/storage/fs/fs.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,10 @@ func (fs *FS) List(prefix, suffix string) ([]storage.FileInfo, error) {
196196
return errors.Wrap(err, "walking the path")
197197
}
198198

199-
info, _ := entry.Info()
199+
info, err := entry.Info()
200+
if err != nil {
201+
return errors.Wrap(err, "getting file info")
202+
}
200203
if info.IsDir() {
201204
return nil
202205
}

pbm/storage/fs/fs_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package fs
33
import (
44
"os"
55
"path/filepath"
6+
"strings"
67
"testing"
78
"time"
89

@@ -98,6 +99,44 @@ func TestList(t *testing.T) {
9899
})
99100
}
100101
})
102+
103+
t.Run("list and delete in parallel", func(t *testing.T) {
104+
tmpDir := setupTestFiles(t)
105+
fs := &FS{root: tmpDir}
106+
107+
errCh := make(chan error)
108+
go func() {
109+
for range 10 {
110+
_, err := fs.List("", "")
111+
if err != nil {
112+
errCh <- err
113+
break
114+
}
115+
}
116+
}()
117+
118+
go func() {
119+
files, err := fs.List("", "")
120+
if err != nil {
121+
t.Errorf("try to fetch deletion list: %v", err)
122+
}
123+
for _, f := range files {
124+
if err := os.Remove(filepath.Join(tmpDir, f.Name)); err != nil {
125+
t.Errorf("error while deleting: %v", err)
126+
}
127+
}
128+
}()
129+
130+
wantErr := "getting file info"
131+
select {
132+
case err := <-errCh:
133+
if !strings.Contains(err.Error(), wantErr) {
134+
t.Fatalf("want err: %s, got=%v", wantErr, err)
135+
}
136+
case <-time.After(2 * time.Second):
137+
t.Log("timed out while waiting for err")
138+
}
139+
})
101140
}
102141

103142
func setupTestFiles(t *testing.T) string {

0 commit comments

Comments
 (0)