Merge pull request #4019 from MichaelEischer/fix-file-saver-race

archiver: Fix race condition resulting in files containing null IDs
This commit is contained in:
Michael Eischer 2022-11-11 20:52:33 +01:00 committed by GitHub
commit 32c9667990
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 0 deletions

View file

@ -48,14 +48,19 @@ func TestBlobSaver(t *testing.T) {
var wait sync.WaitGroup var wait sync.WaitGroup
var results []SaveBlobResponse var results []SaveBlobResponse
var lock sync.Mutex
wait.Add(20) wait.Add(20)
for i := 0; i < 20; i++ { for i := 0; i < 20; i++ {
buf := &Buffer{Data: []byte(fmt.Sprintf("foo%d", i))} buf := &Buffer{Data: []byte(fmt.Sprintf("foo%d", i))}
idx := i idx := i
lock.Lock()
results = append(results, SaveBlobResponse{}) results = append(results, SaveBlobResponse{})
lock.Unlock()
b.Save(ctx, restic.DataBlob, buf, func(res SaveBlobResponse) { b.Save(ctx, restic.DataBlob, buf, func(res SaveBlobResponse) {
lock.Lock()
results[idx] = res results[idx] = res
lock.Unlock()
wait.Done() wait.Done()
}) })
} }

View file

@ -199,7 +199,10 @@ func (s *FileSaver) saveFile(ctx context.Context, chnker *chunker.Chunker, snPat
// add a place to store the saveBlob result // add a place to store the saveBlob result
pos := idx pos := idx
lock.Lock()
node.Content = append(node.Content, restic.ID{}) node.Content = append(node.Content, restic.ID{})
lock.Unlock()
s.saveBlob(ctx, restic.DataBlob, buf, func(sbr SaveBlobResponse) { s.saveBlob(ctx, restic.DataBlob, buf, func(sbr SaveBlobResponse) {
lock.Lock() lock.Lock()