forked from TrueCloudLab/restic
repository: Save pack files for trees in cache
This commit is contained in:
parent
62ba9f1950
commit
7a5fde8f5a
2 changed files with 33 additions and 12 deletions
|
@ -89,8 +89,8 @@ func (r *packerManager) insertPacker(p *Packer) {
|
|||
}
|
||||
|
||||
// savePacker stores p in the backend.
|
||||
func (r *Repository) savePacker(p *Packer) error {
|
||||
debug.Log("save packer with %d blobs (%d bytes)\n", p.Packer.Count(), p.Packer.Size())
|
||||
func (r *Repository) savePacker(t restic.BlobType, p *Packer) error {
|
||||
debug.Log("save packer for %v with %d blobs (%d bytes)\n", t, p.Packer.Count(), p.Packer.Size())
|
||||
_, err := p.Packer.Finalize()
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -112,6 +112,20 @@ func (r *Repository) savePacker(p *Packer) error {
|
|||
|
||||
debug.Log("saved as %v", h)
|
||||
|
||||
if t == restic.TreeBlob && r.Cache != nil {
|
||||
debug.Log("saving tree pack file in cache")
|
||||
|
||||
_, err = p.tmpfile.Seek(0, 0)
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "Seek")
|
||||
}
|
||||
|
||||
err := r.Cache.Save(h, p.tmpfile)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
err = p.tmpfile.Close()
|
||||
if err != nil {
|
||||
return errors.Wrap(err, "close tempfile")
|
||||
|
|
|
@ -223,7 +223,7 @@ func (r *Repository) SaveAndEncrypt(ctx context.Context, t restic.BlobType, data
|
|||
}
|
||||
|
||||
// else write the pack to the backend
|
||||
return *id, r.savePacker(packer)
|
||||
return *id, r.savePacker(t, packer)
|
||||
}
|
||||
|
||||
// SaveJSONUnpacked serialises item as JSON and encrypts and saves it in the
|
||||
|
@ -262,20 +262,27 @@ func (r *Repository) SaveUnpacked(ctx context.Context, t restic.FileType, p []by
|
|||
|
||||
// Flush saves all remaining packs.
|
||||
func (r *Repository) Flush() error {
|
||||
for _, pm := range []*packerManager{r.dataPM, r.treePM} {
|
||||
pm.pm.Lock()
|
||||
pms := []struct {
|
||||
t restic.BlobType
|
||||
pm *packerManager
|
||||
}{
|
||||
{restic.DataBlob, r.dataPM},
|
||||
{restic.TreeBlob, r.treePM},
|
||||
}
|
||||
|
||||
debug.Log("manually flushing %d packs", len(pm.packers))
|
||||
for _, p := range pm.packers {
|
||||
err := r.savePacker(p)
|
||||
for _, p := range pms {
|
||||
p.pm.pm.Lock()
|
||||
|
||||
debug.Log("manually flushing %d packs", len(p.pm.packers))
|
||||
for _, packer := range p.pm.packers {
|
||||
err := r.savePacker(p.t, packer)
|
||||
if err != nil {
|
||||
pm.pm.Unlock()
|
||||
p.pm.pm.Unlock()
|
||||
return err
|
||||
}
|
||||
}
|
||||
pm.packers = pm.packers[:0]
|
||||
|
||||
pm.pm.Unlock()
|
||||
p.pm.packers = p.pm.packers[:0]
|
||||
p.pm.pm.Unlock()
|
||||
}
|
||||
|
||||
return nil
|
||||
|
|
Loading…
Reference in a new issue