From 7a5fde8f5a75008cefaee212a61095f57eb86768 Mon Sep 17 00:00:00 2001 From: Alexander Neumann Date: Sun, 16 Jul 2017 20:24:37 +0200 Subject: [PATCH] repository: Save pack files for trees in cache --- internal/repository/packer_manager.go | 18 ++++++++++++++++-- internal/repository/repository.go | 27 +++++++++++++++++---------- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/internal/repository/packer_manager.go b/internal/repository/packer_manager.go index aa1885cc1..3b905903c 100644 --- a/internal/repository/packer_manager.go +++ b/internal/repository/packer_manager.go @@ -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") diff --git a/internal/repository/repository.go b/internal/repository/repository.go index 8d1234637..06c022d86 100644 --- a/internal/repository/repository.go +++ b/internal/repository/repository.go @@ -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