mirror of
https://github.com/restic/restic.git
synced 2025-12-04 03:38:25 +00:00
Save new packs in index atomically
This commit fixes a situation reported by a user where two indexes
contained information about the same pack without overlap, e.g.:
Index 3e6a32 contained:
{
"id": "c02e3b",
"blobs": [
{
"id": "8114b1",
"type": "data",
"offset": 0,
"length": 530107
}
]
}
And index 62da5f contained:
{
"id": "c02e3b",
"blobs": [
{
"id": "e344f8",
"type": "data",
"offset": 1975848,
"length": 3426468
},
{
"id": "939ed9",
"type": "data",
"offset": 530107,
"length": 1445741
}
]
}
This commit adds all blobs in a pack in one atomic operation so that
intermediate such as these do not happen.
This commit is contained in:
@@ -109,6 +109,22 @@ func (idx *Index) Store(blob PackedBlob) {
|
||||
idx.store(blob)
|
||||
}
|
||||
|
||||
// StoreBlobs saves information about the blobs to the index in one atomic transaction.
|
||||
func (idx *Index) StoreBlobs(blobs []PackedBlob) {
|
||||
idx.m.Lock()
|
||||
defer idx.m.Unlock()
|
||||
|
||||
if idx.final {
|
||||
panic("store new item in finalized index")
|
||||
}
|
||||
|
||||
debug.Log("Index.StoreBlobs", "stored %d blobs", len(blobs))
|
||||
|
||||
for _, blob := range blobs {
|
||||
idx.store(blob)
|
||||
}
|
||||
}
|
||||
|
||||
// Lookup queries the index for the blob ID and returns a PackedBlob.
|
||||
func (idx *Index) Lookup(id backend.ID) (pb PackedBlob, err error) {
|
||||
idx.m.Lock()
|
||||
|
||||
Reference in New Issue
Block a user