mirror of
https://github.com/restic/restic.git
synced 2025-08-11 07:58:26 +00:00
archiver: Fix race condition resulting in files containing null IDs
In some rare cases files could be created which contain null IDs (all zero) in their content list. This was caused by a race condition between growing the `Content` slice and inserting the blob IDs into it. In some cases the blob ID was written to the old slice, which a short time afterwards was replaced with a larger copy, that did not yet contain the blob ID.
This commit is contained in:
@@ -48,14 +48,19 @@ func TestBlobSaver(t *testing.T) {
|
||||
|
||||
var wait sync.WaitGroup
|
||||
var results []SaveBlobResponse
|
||||
var lock sync.Mutex
|
||||
|
||||
wait.Add(20)
|
||||
for i := 0; i < 20; i++ {
|
||||
buf := &Buffer{Data: []byte(fmt.Sprintf("foo%d", i))}
|
||||
idx := i
|
||||
lock.Lock()
|
||||
results = append(results, SaveBlobResponse{})
|
||||
lock.Unlock()
|
||||
b.Save(ctx, restic.DataBlob, buf, func(res SaveBlobResponse) {
|
||||
lock.Lock()
|
||||
results[idx] = res
|
||||
lock.Unlock()
|
||||
wait.Done()
|
||||
})
|
||||
}
|
||||
|
@@ -199,7 +199,10 @@ func (s *FileSaver) saveFile(ctx context.Context, chnker *chunker.Chunker, snPat
|
||||
|
||||
// add a place to store the saveBlob result
|
||||
pos := idx
|
||||
|
||||
lock.Lock()
|
||||
node.Content = append(node.Content, restic.ID{})
|
||||
lock.Unlock()
|
||||
|
||||
s.saveBlob(ctx, restic.DataBlob, buf, func(sbr SaveBlobResponse) {
|
||||
lock.Lock()
|
||||
|
Reference in New Issue
Block a user