mirror of
https://github.com/octoleo/restic.git
synced 2024-11-26 06:46:34 +00:00
repository: index saving belongs into the MasterIndex
This commit is contained in:
parent
0c0e7b6957
commit
a77d5c4d11
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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.
|
||||||
|
@ -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)
|
||||||
|
@ -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 {
|
||||||
|
@ -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{})
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user