2
2
mirror of https://github.com/octoleo/restic.git synced 2024-11-15 17:47:21 +00:00

repository: index saving belongs into the MasterIndex

This commit is contained in:
Michael Eischer 2022-05-26 12:38:18 +02:00
parent 0c0e7b6957
commit a77d5c4d11
7 changed files with 54 additions and 54 deletions

View File

@ -508,7 +508,6 @@ func TestCheckerBlobTypeConfusion(t *testing.T) {
test.OK(t, err) test.OK(t, err)
test.OK(t, repo.Flush(ctx)) test.OK(t, repo.Flush(ctx))
test.OK(t, repo.SaveIndex(ctx))
snapshot, err := restic.NewSnapshot([]string{"/damaged"}, []string{"test"}, "foo", time.Now()) snapshot, err := restic.NewSnapshot([]string{"/damaged"}, []string{"test"}, "foo", time.Now())
test.OK(t, err) test.OK(t, err)

View File

@ -1,6 +1,7 @@
package repository package repository
import ( import (
"bytes"
"context" "context"
"fmt" "fmt"
"sync" "sync"
@ -405,6 +406,44 @@ func (mi *MasterIndex) Save(ctx context.Context, repo restic.Repository, packBla
return obsolete, err return obsolete, err
} }
// SaveIndex saves an index in the repository.
func SaveIndex(ctx context.Context, repo restic.SaverUnpacked, index *Index) (restic.ID, error) {
buf := bytes.NewBuffer(nil)
err := index.Encode(buf)
if err != nil {
return restic.ID{}, err
}
return repo.SaveUnpacked(ctx, restic.IndexFile, buf.Bytes())
}
// saveIndex saves all indexes in the backend.
func (mi *MasterIndex) saveIndex(ctx context.Context, r restic.SaverUnpacked, indexes ...*Index) error {
for i, idx := range indexes {
debug.Log("Saving index %d", i)
sid, err := SaveIndex(ctx, r, idx)
if err != nil {
return err
}
debug.Log("Saved index %d as %v", i, sid)
}
return mi.MergeFinalIndexes()
}
// SaveIndex saves all new indexes in the backend.
func (mi *MasterIndex) SaveIndex(ctx context.Context, r restic.SaverUnpacked) error {
return mi.saveIndex(ctx, r, mi.FinalizeNotFinalIndexes()...)
}
// SaveFullIndex saves all full indexes in the backend.
func (mi *MasterIndex) SaveFullIndex(ctx context.Context, r restic.SaverUnpacked) error {
return mi.saveIndex(ctx, r, mi.FinalizeFullIndexes()...)
}
// ListPacks returns the blobs of the specified pack files grouped by pack file. // ListPacks returns the blobs of the specified pack files grouped by pack file.
func (mi *MasterIndex) ListPacks(ctx context.Context, packs restic.IDSet) <-chan restic.PackBlobs { func (mi *MasterIndex) ListPacks(ctx context.Context, packs restic.IDSet) <-chan restic.PackBlobs {
out := make(chan restic.PackBlobs) out := make(chan restic.PackBlobs)

View File

@ -154,7 +154,7 @@ func (r *Repository) savePacker(ctx context.Context, t restic.BlobType, p *Packe
if r.noAutoIndexUpdate { if r.noAutoIndexUpdate {
return nil return nil
} }
return r.SaveFullIndex(ctx) return r.idx.SaveFullIndex(ctx, r)
} }
// countPacker returns the number of open (unfinished) packers. // countPacker returns the number of open (unfinished) packers.

View File

@ -155,8 +155,8 @@ func repack(t *testing.T, repo restic.Repository, packs restic.IDSet, blobs rest
} }
} }
func saveIndex(t *testing.T, repo restic.Repository) { func flush(t *testing.T, repo restic.Repository) {
if err := repo.SaveIndex(context.TODO()); err != nil { if err := repo.Flush(context.TODO()); err != nil {
t.Fatalf("repo.SaveIndex() %v", err) t.Fatalf("repo.SaveIndex() %v", err)
} }
} }
@ -237,7 +237,7 @@ func testRepack(t *testing.T, version uint) {
packsBefore, packsAfter) packsBefore, packsAfter)
} }
saveIndex(t, repo) flush(t, repo)
removeBlobs, keepBlobs := selectBlobs(t, repo, 0.2) removeBlobs, keepBlobs := selectBlobs(t, repo, 0.2)
@ -297,7 +297,7 @@ func testRepackCopy(t *testing.T, version uint) {
t.Logf("rand seed is %v", seed) t.Logf("rand seed is %v", seed)
createRandomBlobs(t, repo, 100, 0.7) createRandomBlobs(t, repo, 100, 0.7)
saveIndex(t, repo) flush(t, repo)
_, keepBlobs := selectBlobs(t, repo, 0.2) _, keepBlobs := selectBlobs(t, repo, 0.2)
copyPacks := findPacksForBlobs(t, repo, keepBlobs) copyPacks := findPacksForBlobs(t, repo, keepBlobs)

View File

@ -527,7 +527,7 @@ func (r *Repository) Flush(ctx context.Context) error {
if r.noAutoIndexUpdate { if r.noAutoIndexUpdate {
return nil return nil
} }
return r.SaveIndex(ctx) return r.idx.SaveIndex(ctx, r)
} }
// FlushPacks saves all remaining packs. // FlushPacks saves all remaining packs.
@ -573,44 +573,6 @@ func (r *Repository) SetIndex(i restic.MasterIndex) error {
return r.PrepareCache() return r.PrepareCache()
} }
// SaveIndex saves an index in the repository.
func SaveIndex(ctx context.Context, repo restic.Repository, index *Index) (restic.ID, error) {
buf := bytes.NewBuffer(nil)
err := index.Encode(buf)
if err != nil {
return restic.ID{}, err
}
return repo.SaveUnpacked(ctx, restic.IndexFile, buf.Bytes())
}
// saveIndex saves all indexes in the backend.
func (r *Repository) saveIndex(ctx context.Context, indexes ...*Index) error {
for i, idx := range indexes {
debug.Log("Saving index %d", i)
sid, err := SaveIndex(ctx, r, idx)
if err != nil {
return err
}
debug.Log("Saved index %d as %v", i, sid)
}
return r.idx.MergeFinalIndexes()
}
// SaveIndex saves all new indexes in the backend.
func (r *Repository) SaveIndex(ctx context.Context) error {
return r.saveIndex(ctx, r.idx.FinalizeNotFinalIndexes()...)
}
// SaveFullIndex saves all full indexes in the backend.
func (r *Repository) SaveFullIndex(ctx context.Context) error {
return r.saveIndex(ctx, r.idx.FinalizeFullIndexes()...)
}
// LoadIndex loads all index files from the backend in parallel and stores them // LoadIndex loads all index files from the backend in parallel and stores them
// in the master index. The first error that occurred is returned. // in the master index. The first error that occurred is returned.
func (r *Repository) LoadIndex(ctx context.Context) error { func (r *Repository) LoadIndex(ctx context.Context) error {

View File

@ -421,8 +421,7 @@ func testRepositoryIncrementalIndex(t *testing.T, version uint) {
saveRandomDataBlobs(t, repo, 5, 1<<15) saveRandomDataBlobs(t, repo, 5, 1<<15)
rtest.OK(t, repo.FlushPacks(context.Background())) rtest.OK(t, repo.FlushPacks(context.Background()))
} }
rtest.OK(t, repo.Flush(context.TODO()))
rtest.OK(t, repo.SaveFullIndex(context.TODO()))
} }
// add another 5 packs // add another 5 packs
@ -432,7 +431,7 @@ func testRepositoryIncrementalIndex(t *testing.T, version uint) {
} }
// save final index // save final index
rtest.OK(t, repo.SaveIndex(context.TODO())) rtest.OK(t, repo.Flush(context.TODO()))
packEntries := make(map[restic.ID]map[restic.ID]struct{}) packEntries := make(map[restic.ID]map[restic.ID]struct{})

View File

@ -15,17 +15,13 @@ type Repository interface {
Key() *crypto.Key Key() *crypto.Key
SetIndex(MasterIndex) error
Index() MasterIndex Index() MasterIndex
SaveFullIndex(context.Context) error
SaveIndex(context.Context) error
LoadIndex(context.Context) error LoadIndex(context.Context) error
SetIndex(MasterIndex) error
LookupBlobSize(ID, BlobType) (uint, bool)
Config() Config Config() Config
LookupBlobSize(ID, BlobType) (uint, bool)
// List calls the function fn for each file of type t in the repository. // List calls the function fn for each file of type t in the repository.
// When an error is returned by fn, processing stops and List() returns the // When an error is returned by fn, processing stops and List() returns the
// error. // error.
@ -65,6 +61,11 @@ type LoadJSONUnpackeder interface {
LoadJSONUnpacked(ctx context.Context, t FileType, id ID, dest interface{}) error LoadJSONUnpacked(ctx context.Context, t FileType, id ID, dest interface{}) error
} }
// SaverUnpacked allows saving a blob not stored in a pack file
type SaverUnpacked interface {
SaveUnpacked(context.Context, FileType, []byte) (ID, error)
}
type PackBlobs struct { type PackBlobs struct {
PackID ID PackID ID
Blobs []Blob Blobs []Blob