mirror of
https://github.com/kopia/kopia.git
synced 2026-04-04 06:22:59 -04:00
refactored Repository API
This commit is contained in:
@@ -24,7 +24,7 @@ func runCatCommand(context *kingpin.ParseContext) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
r, err := rep.Open(oid)
|
||||
r, err := rep.Objects.Open(oid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ func init() {
|
||||
func listMetadataItems(context *kingpin.ParseContext) error {
|
||||
rep := mustOpenRepository(nil)
|
||||
|
||||
entries, err := rep.ListMetadata(*metadataListPrefix)
|
||||
entries, err := rep.Metadata.List(*metadataListPrefix)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -14,5 +14,5 @@ func init() {
|
||||
func removeMetadataItem(context *kingpin.ParseContext) error {
|
||||
rep := mustOpenRepository(nil)
|
||||
|
||||
return rep.RemoveMany(*metadataRemoveItems)
|
||||
return rep.Metadata.RemoveMany(*metadataRemoveItems)
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ func init() {
|
||||
func showMetadataObject(context *kingpin.ParseContext) error {
|
||||
rep := mustOpenRepository(nil)
|
||||
|
||||
b, err := rep.MetadataManager.GetMetadata(*metadataShowID)
|
||||
b, err := rep.Metadata.GetMetadata(*metadataShowID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ func runMountCommand(context *kingpin.ParseContext) error {
|
||||
for {
|
||||
select {
|
||||
case <-time.After(*mountCacheRefreshInterval):
|
||||
rep.RefreshCache()
|
||||
rep.Metadata.RefreshCache()
|
||||
// TODO - cancel the loop perhaps?
|
||||
}
|
||||
}
|
||||
|
||||
@@ -121,7 +121,7 @@ type cleanupContext struct {
|
||||
}
|
||||
|
||||
func findAliveBlocks(ctx *cleanupContext, wi *cleanupWorkItem) error {
|
||||
blks, err := ctx.repo.GetStorageBlocks(wi.oid)
|
||||
blks, err := ctx.repo.Objects.GetStorageBlocks(wi.oid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ func runShowCommand(context *kingpin.ParseContext) error {
|
||||
func showObject(r *repo.Repository, oid repo.ObjectID) error {
|
||||
var rd io.ReadCloser
|
||||
|
||||
rd, err := r.Open(oid)
|
||||
rd, err := r.Objects.Open(oid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ func runOptimizeCommand(context *kingpin.ParseContext) error {
|
||||
rep := mustOpenRepository(nil)
|
||||
defer rep.Close()
|
||||
|
||||
return rep.Optimize(time.Now().Add(-*optimizeMinAge))
|
||||
return rep.Objects.Optimize(time.Now().Add(-*optimizeMinAge))
|
||||
}
|
||||
|
||||
func init() {
|
||||
|
||||
@@ -208,7 +208,7 @@ func runExpireCommand(context *kingpin.ParseContext) error {
|
||||
}
|
||||
if *snapshotExpireDelete == "yes" {
|
||||
fmt.Fprintf(os.Stderr, "Deleting %v snapshots...\n", len(toDelete))
|
||||
if err := rep.RemoveMany(toDelete); err != nil {
|
||||
if err := rep.Metadata.RemoveMany(toDelete); err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -87,7 +87,7 @@ func Connect(ctx context.Context, configFile string, st blob.Storage, creds auth
|
||||
return err
|
||||
}
|
||||
|
||||
cfg, err := r.connectionConfiguration()
|
||||
cfg, err := r.Metadata.connectionConfiguration()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -130,9 +130,9 @@ func connect(ctx context.Context, st blob.Storage, creds auth.Credentials, optio
|
||||
}
|
||||
|
||||
return &Repository{
|
||||
ObjectManager: om,
|
||||
MetadataManager: mm,
|
||||
Storage: st,
|
||||
Objects: om,
|
||||
Metadata: mm,
|
||||
Storage: st,
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
||||
@@ -66,8 +66,8 @@ type MetadataManager struct {
|
||||
authData []byte // additional data to authenticate
|
||||
}
|
||||
|
||||
// PutMetadata saves the specified metadata content under a provided name.
|
||||
func (mm *MetadataManager) PutMetadata(itemID string, content []byte) error {
|
||||
// Put saves the specified metadata content under a provided name.
|
||||
func (mm *MetadataManager) Put(itemID string, content []byte) error {
|
||||
if err := checkReservedName(itemID); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -139,9 +139,9 @@ func (mm *MetadataManager) GetMetadata(itemID string) ([]byte, error) {
|
||||
return mm.readEncryptedBlock(itemID)
|
||||
}
|
||||
|
||||
// MultiGetMetadata gets the contents of a specified multiple metadata items efficiently.
|
||||
// MultiGet gets the contents of a specified multiple metadata items efficiently.
|
||||
// The results are returned as a map, with items that are not found not present in the map.
|
||||
func (mm *MetadataManager) MultiGetMetadata(itemIDs []string) (map[string][]byte, error) {
|
||||
func (mm *MetadataManager) MultiGet(itemIDs []string) (map[string][]byte, error) {
|
||||
type singleReadResult struct {
|
||||
id string
|
||||
contents []byte
|
||||
@@ -205,19 +205,19 @@ func (mm *MetadataManager) putJSON(id string, content interface{}) error {
|
||||
return mm.writeEncryptedBlock(id, j)
|
||||
}
|
||||
|
||||
// ListMetadata returns the list of metadata items matching the specified prefix.
|
||||
func (mm *MetadataManager) ListMetadata(prefix string) ([]string, error) {
|
||||
// List returns the list of metadata items matching the specified prefix.
|
||||
func (mm *MetadataManager) List(prefix string) ([]string, error) {
|
||||
return mm.cache.ListBlocks(prefix)
|
||||
}
|
||||
|
||||
// ListMetadataContents retrieves metadata contents for all items starting with a given prefix.
|
||||
func (mm *MetadataManager) ListMetadataContents(prefix string) (map[string][]byte, error) {
|
||||
itemIDs, err := mm.ListMetadata(prefix)
|
||||
// ListContents retrieves metadata contents for all items starting with a given prefix.
|
||||
func (mm *MetadataManager) ListContents(prefix string) (map[string][]byte, error) {
|
||||
itemIDs, err := mm.List(prefix)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return mm.MultiGetMetadata(itemIDs)
|
||||
return mm.MultiGet(itemIDs)
|
||||
}
|
||||
|
||||
// Config returns a configuration of storage its credentials that's suitable
|
||||
@@ -236,8 +236,8 @@ func (mm *MetadataManager) connectionConfiguration() (*config.RepositoryConnecti
|
||||
}, nil
|
||||
}
|
||||
|
||||
// RemoveMetadata removes the specified metadata item.
|
||||
func (mm *MetadataManager) RemoveMetadata(itemID string) error {
|
||||
// Remove removes the specified metadata item.
|
||||
func (mm *MetadataManager) Remove(itemID string) error {
|
||||
if err := checkReservedName(itemID); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -258,7 +258,7 @@ func (mm *MetadataManager) RemoveMany(itemIDs []string) error {
|
||||
defer wg.Done()
|
||||
|
||||
for id := range ch {
|
||||
if err := mm.RemoveMetadata(id); err != nil {
|
||||
if err := mm.Remove(id); err != nil {
|
||||
errch <- err
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,13 +62,13 @@ func TestMetadataManager(t *testing.T) {
|
||||
return
|
||||
}
|
||||
|
||||
if err := v.PutMetadata("foo", []byte("test1")); err != nil {
|
||||
if err := v.Put("foo", []byte("test1")); err != nil {
|
||||
t.Errorf("error putting: %v", err)
|
||||
}
|
||||
if err := v.PutMetadata("bar", []byte("test2")); err != nil {
|
||||
if err := v.Put("bar", []byte("test2")); err != nil {
|
||||
t.Errorf("error putting: %v", err)
|
||||
}
|
||||
if err := v.PutMetadata("baz", []byte("test3")); err != nil {
|
||||
if err := v.Put("baz", []byte("test3")); err != nil {
|
||||
t.Errorf("error putting: %v", err)
|
||||
}
|
||||
|
||||
@@ -87,7 +87,7 @@ func TestMetadataManager(t *testing.T) {
|
||||
assertReservedName(t, v, formatBlockID)
|
||||
assertReservedName(t, v, repositoryConfigBlockID)
|
||||
|
||||
v.RemoveMetadata("bar")
|
||||
v.Remove("bar")
|
||||
|
||||
assertMetadataItem(t, v, "foo", "test1")
|
||||
assertMetadataItemNotFound(t, v, "bar")
|
||||
@@ -100,13 +100,13 @@ func TestMetadataManager(t *testing.T) {
|
||||
assertMetadataItems(t, v, "baz", []string{"baz"})
|
||||
assertMetadataItems(t, v, "bazx", nil)
|
||||
|
||||
v.RemoveMetadata("baz")
|
||||
v.Remove("baz")
|
||||
assertMetadataItemNotFound(t, v, "baz")
|
||||
v.RemoveMetadata("baz")
|
||||
v.Remove("baz")
|
||||
assertMetadataItemNotFound(t, v, "baz")
|
||||
|
||||
assertMetadataItem(t, v, "foo", "test1")
|
||||
if err := v.PutMetadata("baz", []byte("test4")); err != nil {
|
||||
if err := v.Put("baz", []byte("test4")); err != nil {
|
||||
t.Errorf("error putting: %v", err)
|
||||
}
|
||||
assertMetadataItem(t, v, "baz", "test4")
|
||||
@@ -146,8 +146,8 @@ func assertMetadataItemNotFound(t *testing.T, v *MetadataManager, itemID string)
|
||||
func assertReservedName(t *testing.T, v *MetadataManager, itemID string) {
|
||||
_, err := v.GetMetadata(itemID)
|
||||
assertReservedNameError(t, "Get", itemID, err)
|
||||
assertReservedNameError(t, "Put", itemID, v.PutMetadata(itemID, nil))
|
||||
assertReservedNameError(t, "Remove", itemID, v.RemoveMetadata(itemID))
|
||||
assertReservedNameError(t, "Put", itemID, v.Put(itemID, nil))
|
||||
assertReservedNameError(t, "Remove", itemID, v.Remove(itemID))
|
||||
}
|
||||
|
||||
func assertReservedNameError(t *testing.T, method string, itemID string, err error) {
|
||||
@@ -163,7 +163,7 @@ func assertReservedNameError(t *testing.T, method string, itemID string, err err
|
||||
|
||||
func assertMetadataItems(t *testing.T, v *MetadataManager, prefix string, expected []string) {
|
||||
t.Helper()
|
||||
res, err := v.ListMetadata(prefix)
|
||||
res, err := v.List(prefix)
|
||||
if err != nil {
|
||||
t.Errorf("error listing items beginning with %v: %v", prefix, err)
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ func TestWriters(t *testing.T) {
|
||||
for _, c := range cases {
|
||||
data, repo := setupTest(t)
|
||||
|
||||
writer := repo.NewWriter(WriterOptions{
|
||||
writer := repo.Objects.NewWriter(WriterOptions{
|
||||
BlockNamePrefix: "X",
|
||||
})
|
||||
|
||||
@@ -81,7 +81,7 @@ func TestWriters(t *testing.T) {
|
||||
continue
|
||||
}
|
||||
|
||||
repo.writeBackWG.Wait()
|
||||
repo.Objects.writeBackWG.Wait()
|
||||
|
||||
if !objectIDsEqual(result, c.objectID) {
|
||||
t.Errorf("incorrect result for %v, expected: %v got: %v %#v", c.data, c.objectID.String(), result.String(), result.BinaryContent)
|
||||
@@ -109,7 +109,7 @@ func TestWriterCompleteChunkInTwoWrites(t *testing.T) {
|
||||
_, repo := setupTest(t)
|
||||
|
||||
bytes := make([]byte, 100)
|
||||
writer := repo.NewWriter(WriterOptions{
|
||||
writer := repo.Objects.NewWriter(WriterOptions{
|
||||
BlockNamePrefix: "X",
|
||||
})
|
||||
writer.Write(bytes[0:50])
|
||||
@@ -129,7 +129,7 @@ func TestPackingSimple(t *testing.T) {
|
||||
content2 := "hi, how are you?"
|
||||
content3 := "thank you!"
|
||||
|
||||
if err := repo.BeginPacking(); err != nil {
|
||||
if err := repo.Objects.BeginPacking(); err != nil {
|
||||
t.Fatalf("error in BeginPacking: %v", err)
|
||||
}
|
||||
|
||||
@@ -138,9 +138,9 @@ func TestPackingSimple(t *testing.T) {
|
||||
oid2a := writeObject(t, repo, []byte(content2), "packed-object-2a")
|
||||
oid2b := writeObject(t, repo, []byte(content2), "packed-object-2b")
|
||||
|
||||
repo.FinishPacking()
|
||||
repo.Objects.FinishPacking()
|
||||
|
||||
if err := repo.BeginPacking(); err != nil {
|
||||
if err := repo.Objects.BeginPacking(); err != nil {
|
||||
t.Fatalf("error in BeginPacking: %v", err)
|
||||
}
|
||||
|
||||
@@ -151,7 +151,7 @@ func TestPackingSimple(t *testing.T) {
|
||||
oid2c := writeObject(t, repo, []byte(content2), "packed-object-2c")
|
||||
oid1c := writeObject(t, repo, []byte(content1), "packed-object-1c")
|
||||
|
||||
repo.FinishPacking()
|
||||
repo.Objects.FinishPacking()
|
||||
|
||||
if got, want := oid1a.String(), oid1b.String(); got != want {
|
||||
t.Errorf("oid1a(%q) != oid1b(%q)", got, want)
|
||||
@@ -189,7 +189,7 @@ func TestPackingSimple(t *testing.T) {
|
||||
verify(t, repo, oid2a, []byte(content2), "packed-object-2")
|
||||
verify(t, repo, oid3a, []byte(content3), "packed-object-3")
|
||||
|
||||
if err := repo.Optimize(time.Now().Add(10 * time.Second)); err != nil {
|
||||
if err := repo.Objects.Optimize(time.Now().Add(10 * time.Second)); err != nil {
|
||||
t.Errorf("optimize error: %v", err)
|
||||
}
|
||||
data, repo = setupTestWithData(t, data, func(n *NewRepositoryOptions) {
|
||||
@@ -200,7 +200,7 @@ func TestPackingSimple(t *testing.T) {
|
||||
verify(t, repo, oid2a, []byte(content2), "packed-object-2")
|
||||
verify(t, repo, oid3a, []byte(content3), "packed-object-3")
|
||||
|
||||
if err := repo.Optimize(time.Now().Add(-10 * time.Second)); err != nil {
|
||||
if err := repo.Objects.Optimize(time.Now().Add(-10 * time.Second)); err != nil {
|
||||
t.Errorf("optimize error: %v", err)
|
||||
}
|
||||
data, repo = setupTestWithData(t, data, func(n *NewRepositoryOptions) {
|
||||
@@ -217,7 +217,7 @@ func verifyIndirectBlock(t *testing.T, r *Repository, oid ObjectID) {
|
||||
direct := *oid.Indirect
|
||||
oid = direct
|
||||
|
||||
rd, err := r.Open(direct)
|
||||
rd, err := r.Objects.Open(direct)
|
||||
if err != nil {
|
||||
t.Errorf("unable to open %v: %v", oid.String(), err)
|
||||
return
|
||||
@@ -262,7 +262,7 @@ func TestIndirection(t *testing.T) {
|
||||
|
||||
contentBytes := make([]byte, c.dataLength)
|
||||
|
||||
writer := repo.NewWriter(WriterOptions{})
|
||||
writer := repo.Objects.NewWriter(WriterOptions{})
|
||||
writer.Write(contentBytes)
|
||||
result, err := writer.Result()
|
||||
if err != nil {
|
||||
@@ -277,7 +277,7 @@ func TestIndirection(t *testing.T) {
|
||||
t.Errorf("unexpected block count for %v: %v, expected %v", c.dataLength, got, want)
|
||||
}
|
||||
|
||||
b, err := repo.GetStorageBlocks(result)
|
||||
b, err := repo.Objects.GetStorageBlocks(result)
|
||||
if err != nil {
|
||||
t.Errorf("error getting storage blocks for %q: %v", result, err)
|
||||
}
|
||||
@@ -303,7 +303,7 @@ func TestHMAC(t *testing.T) {
|
||||
|
||||
_, repo := setupTest(t)
|
||||
|
||||
w := repo.NewWriter(WriterOptions{})
|
||||
w := repo.Objects.NewWriter(WriterOptions{})
|
||||
w.Write(content)
|
||||
result, err := w.Result()
|
||||
if result.String() != "D999732b72ceff665b3f7608411db66a4" {
|
||||
@@ -340,7 +340,7 @@ func TestReader(t *testing.T) {
|
||||
continue
|
||||
}
|
||||
|
||||
reader, err := repo.Open(objectID)
|
||||
reader, err := repo.Objects.Open(objectID)
|
||||
if err != nil {
|
||||
t.Errorf("cannot create reader for %v: %v", objectID, err)
|
||||
continue
|
||||
@@ -375,7 +375,7 @@ func TestMalformedStoredData(t *testing.T) {
|
||||
continue
|
||||
}
|
||||
|
||||
reader, err := repo.Open(objectID)
|
||||
reader, err := repo.Objects.Open(objectID)
|
||||
if err == nil || reader != nil {
|
||||
t.Errorf("expected error for %x", c)
|
||||
}
|
||||
@@ -389,7 +389,7 @@ func TestReaderStoredBlockNotFound(t *testing.T) {
|
||||
if err != nil {
|
||||
t.Errorf("cannot parse object ID: %v", err)
|
||||
}
|
||||
reader, err := repo.Open(objectID)
|
||||
reader, err := repo.Objects.Open(objectID)
|
||||
if err != blob.ErrBlockNotFound || reader != nil {
|
||||
t.Errorf("unexpected result: reader: %v err: %v", reader, err)
|
||||
}
|
||||
@@ -403,7 +403,7 @@ func TestEndToEndReadAndSeek(t *testing.T) {
|
||||
randomData := make([]byte, size)
|
||||
cryptorand.Read(randomData)
|
||||
|
||||
writer := repo.NewWriter(WriterOptions{
|
||||
writer := repo.Objects.NewWriter(WriterOptions{
|
||||
BlockNamePrefix: "X",
|
||||
})
|
||||
writer.Write(randomData)
|
||||
@@ -429,7 +429,7 @@ func TestEndToEndReadAndSeek(t *testing.T) {
|
||||
}
|
||||
|
||||
func writeObject(t *testing.T, repo *Repository, data []byte, testCaseID string) ObjectID {
|
||||
w := repo.NewWriter(WriterOptions{})
|
||||
w := repo.Objects.NewWriter(WriterOptions{})
|
||||
if _, err := w.Write(data); err != nil {
|
||||
t.Fatalf("can't write object %q - write failed: %v", testCaseID, err)
|
||||
|
||||
@@ -443,7 +443,7 @@ func writeObject(t *testing.T, repo *Repository, data []byte, testCaseID string)
|
||||
}
|
||||
|
||||
func verify(t *testing.T, repo *Repository, objectID ObjectID, expectedData []byte, testCaseID string) {
|
||||
reader, err := repo.Open(objectID)
|
||||
reader, err := repo.Objects.Open(objectID)
|
||||
if err != nil {
|
||||
t.Errorf("cannot get reader for %v (%v): %v %v", testCaseID, objectID, err, string(debug.Stack()))
|
||||
return
|
||||
@@ -523,7 +523,7 @@ func TestFormats(t *testing.T) {
|
||||
|
||||
for k, v := range c.oids {
|
||||
bytesToWrite := []byte(k)
|
||||
w := repo.NewWriter(WriterOptions{})
|
||||
w := repo.Objects.NewWriter(WriterOptions{})
|
||||
w.Write(bytesToWrite)
|
||||
oid, err := w.Result()
|
||||
if err != nil {
|
||||
@@ -533,7 +533,7 @@ func TestFormats(t *testing.T) {
|
||||
t.Errorf("invalid oid for #%v\ngot:\n%#v\nexpected:\n%#v", caseIndex, oid.String(), v.String())
|
||||
}
|
||||
|
||||
rc, err := repo.Open(oid)
|
||||
rc, err := repo.Objects.Open(oid)
|
||||
if err != nil {
|
||||
t.Errorf("open failed: %v", err)
|
||||
continue
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
|
||||
// Repository represents storage where both content-addressable and user-addressable data is kept.
|
||||
type Repository struct {
|
||||
*ObjectManager
|
||||
*MetadataManager
|
||||
Storage blob.Storage
|
||||
Objects *ObjectManager
|
||||
Metadata *MetadataManager
|
||||
Storage blob.Storage
|
||||
|
||||
ConfigFile string
|
||||
CacheDirectory string
|
||||
@@ -36,27 +36,27 @@ type StatusInfo struct {
|
||||
|
||||
// Stats returns repository-wide statistics.
|
||||
func (r *Repository) Stats() Stats {
|
||||
return r.ObjectManager.stats
|
||||
return r.Objects.stats
|
||||
}
|
||||
|
||||
// Status returns a snapshot of repository-wide statistics plus some general information about repository configuration.
|
||||
func (r *Repository) Status() StatusInfo {
|
||||
s := StatusInfo{
|
||||
Stats: r.ObjectManager.stats,
|
||||
Stats: r.Objects.stats,
|
||||
|
||||
MetadataManagerVersion: r.MetadataManager.format.Version,
|
||||
UniqueID: hex.EncodeToString(r.MetadataManager.format.UniqueID),
|
||||
MetadataEncryptionAlgorithm: r.MetadataManager.format.EncryptionAlgorithm,
|
||||
KeyDerivationAlgorithm: r.MetadataManager.format.KeyDerivationAlgorithm,
|
||||
MetadataManagerVersion: r.Metadata.format.Version,
|
||||
UniqueID: hex.EncodeToString(r.Metadata.format.UniqueID),
|
||||
MetadataEncryptionAlgorithm: r.Metadata.format.EncryptionAlgorithm,
|
||||
KeyDerivationAlgorithm: r.Metadata.format.KeyDerivationAlgorithm,
|
||||
|
||||
ObjectManagerVersion: fmt.Sprintf("%v", r.ObjectManager.format.Version),
|
||||
ObjectFormat: r.ObjectManager.format.ObjectFormat,
|
||||
Splitter: r.ObjectManager.format.Splitter,
|
||||
MinBlockSize: r.ObjectManager.format.MinBlockSize,
|
||||
AvgBlockSize: r.ObjectManager.format.AvgBlockSize,
|
||||
MaxBlockSize: r.ObjectManager.format.MaxBlockSize,
|
||||
ObjectManagerVersion: fmt.Sprintf("%v", r.Objects.format.Version),
|
||||
ObjectFormat: r.Objects.format.ObjectFormat,
|
||||
Splitter: r.Objects.format.Splitter,
|
||||
MinBlockSize: r.Objects.format.MinBlockSize,
|
||||
AvgBlockSize: r.Objects.format.AvgBlockSize,
|
||||
MaxBlockSize: r.Objects.format.MaxBlockSize,
|
||||
|
||||
MaxPackedContentLength: r.ObjectManager.format.MaxPackedContentLength,
|
||||
MaxPackedContentLength: r.Objects.format.MaxPackedContentLength,
|
||||
}
|
||||
|
||||
if s.Splitter == "" {
|
||||
@@ -68,7 +68,7 @@ func (r *Repository) Status() StatusInfo {
|
||||
|
||||
// Close closes the repository and releases all resources.
|
||||
func (r *Repository) Close() error {
|
||||
if err := r.ObjectManager.Close(); err != nil {
|
||||
if err := r.Objects.Close(); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := r.Storage.Close(); err != nil {
|
||||
@@ -79,11 +79,11 @@ func (r *Repository) Close() error {
|
||||
|
||||
// Flush waits for all in-flight writes to complete.
|
||||
func (r *Repository) Flush() error {
|
||||
r.ObjectManager.writeBackWG.Wait()
|
||||
r.Objects.writeBackWG.Wait()
|
||||
return nil
|
||||
}
|
||||
|
||||
// ResetStats resets all repository-wide statistics to zero values.
|
||||
func (r *Repository) ResetStats() {
|
||||
r.ObjectManager.stats = Stats{}
|
||||
r.Objects.stats = Stats{}
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ type Manager struct {
|
||||
|
||||
// ListSources lists all snapshot sources.
|
||||
func (m *Manager) ListSources() ([]*SourceInfo, error) {
|
||||
names, err := m.repository.ListMetadata(snapshotPrefix)
|
||||
names, err := m.repository.Metadata.List(snapshotPrefix)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -64,7 +64,7 @@ func (m *Manager) ListSources() ([]*SourceInfo, error) {
|
||||
|
||||
// ListSnapshots lists all snapshots for a given source.
|
||||
func (m *Manager) ListSnapshots(si *SourceInfo) ([]*Manifest, error) {
|
||||
names, err := m.repository.ListMetadata(m.snapshotIDPrefix(si))
|
||||
names, err := m.repository.Metadata.List(m.snapshotIDPrefix(si))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -74,7 +74,7 @@ func (m *Manager) ListSnapshots(si *SourceInfo) ([]*Manifest, error) {
|
||||
|
||||
// LoadSnapshot loads and parses a snapshot with a given ID.
|
||||
func (m *Manager) LoadSnapshot(manifestID string) (*Manifest, error) {
|
||||
b, err := m.repository.GetMetadata(manifestID)
|
||||
b, err := m.repository.Metadata.GetMetadata(manifestID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("error loading previous backup: %v", err)
|
||||
}
|
||||
@@ -99,7 +99,7 @@ func (m *Manager) SaveSnapshot(manifest *Manifest) (string, error) {
|
||||
return "", fmt.Errorf("cannot marshal backup manifest to JSON: %v", err)
|
||||
}
|
||||
|
||||
if err := m.repository.PutMetadata(manifestID, b); err != nil {
|
||||
if err := m.repository.Metadata.Put(manifestID, b); err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
@@ -147,7 +147,7 @@ func (m *Manager) ListSnapshotManifests(src *SourceInfo) ([]string, error) {
|
||||
prefix = m.snapshotIDPrefix(src)
|
||||
}
|
||||
|
||||
return m.repository.ListMetadata(prefix)
|
||||
return m.repository.Metadata.List(prefix)
|
||||
}
|
||||
|
||||
// GetEffectivePolicy calculates effective snapshot policy for a given source by combining the source-specifc policy (if any)
|
||||
@@ -228,12 +228,12 @@ func (m *Manager) SavePolicy(p *Policy) error {
|
||||
return fmt.Errorf("cannot marshal policy to JSON: %v", err)
|
||||
}
|
||||
|
||||
return m.repository.PutMetadata(m.policyID(&p.Source), b)
|
||||
return m.repository.Metadata.Put(m.policyID(&p.Source), b)
|
||||
}
|
||||
|
||||
// RemovePolicy removes the policy for a given source
|
||||
func (m *Manager) RemovePolicy(src *SourceInfo) error {
|
||||
return m.repository.RemoveMetadata(m.policyID(src))
|
||||
return m.repository.Metadata.Remove(m.policyID(src))
|
||||
}
|
||||
|
||||
// GetPolicy retrieves the Policy for a given source, if defined.
|
||||
@@ -251,7 +251,7 @@ func (m *Manager) policyID(src *SourceInfo) string {
|
||||
}
|
||||
|
||||
func (m *Manager) getPolicyItem(itemID string) (*Policy, error) {
|
||||
b, err := m.repository.GetMetadata(itemID)
|
||||
b, err := m.repository.Metadata.GetMetadata(itemID)
|
||||
if err == repo.ErrMetadataNotFound {
|
||||
return nil, ErrPolicyNotFound
|
||||
}
|
||||
@@ -270,7 +270,7 @@ func (m *Manager) getPolicyItem(itemID string) (*Policy, error) {
|
||||
|
||||
// ListPolicies returns a list of all snapshot policies.
|
||||
func (m *Manager) ListPolicies() ([]*Policy, error) {
|
||||
names, err := m.repository.ListMetadata(policyPrefix)
|
||||
names, err := m.repository.Metadata.List(policyPrefix)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -311,7 +311,7 @@ func (m *Manager) ListPolicies() ([]*Policy, error) {
|
||||
func NewManager(r *repo.Repository) *Manager {
|
||||
return &Manager{
|
||||
r,
|
||||
r.DeriveKey([]byte("snapshot-id"), 32),
|
||||
r.DeriveKey([]byte("policyID-id"), 32),
|
||||
r.Metadata.DeriveKey([]byte("snapshot-id"), 32),
|
||||
r.Metadata.DeriveKey([]byte("policyID-id"), 32),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ type repositorySymlink struct {
|
||||
}
|
||||
|
||||
func (rd *repositoryDirectory) Readdir() (fs.Entries, error) {
|
||||
r, err := rd.repo.Open(rd.metadata.ObjectID)
|
||||
r, err := rd.repo.Objects.Open(rd.metadata.ObjectID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -60,7 +60,7 @@ func (rd *repositoryDirectory) Readdir() (fs.Entries, error) {
|
||||
}
|
||||
|
||||
func (rf *repositoryFile) Open() (fs.Reader, error) {
|
||||
r, err := rf.repo.Open(rf.metadata.ObjectID)
|
||||
r, err := rf.repo.Objects.Open(rf.metadata.ObjectID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -69,7 +69,7 @@ func (rf *repositoryFile) Open() (fs.Reader, error) {
|
||||
}
|
||||
|
||||
func (rsl *repositorySymlink) Readlink() (string, error) {
|
||||
r, err := rsl.repo.Open(rsl.metadata.ObjectID)
|
||||
r, err := rsl.repo.Objects.Open(rsl.metadata.ObjectID)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@ func (u *Uploader) uploadFileInternal(f fs.File, relativePath string) (*dir.Entr
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
writer := u.repo.NewWriter(repo.WriterOptions{
|
||||
writer := u.repo.Objects.NewWriter(repo.WriterOptions{
|
||||
Description: "FILE:" + f.Metadata().Name,
|
||||
})
|
||||
defer writer.Close()
|
||||
@@ -131,7 +131,7 @@ func (u *Uploader) uploadSymlinkInternal(f fs.Symlink, relativePath string) (*di
|
||||
return nil, 0, fmt.Errorf("unable to read symlink: %v", err)
|
||||
}
|
||||
|
||||
writer := u.repo.NewWriter(repo.WriterOptions{
|
||||
writer := u.repo.Objects.NewWriter(repo.WriterOptions{
|
||||
Description: "SYMLINK:" + f.Metadata().Name,
|
||||
})
|
||||
defer writer.Close()
|
||||
@@ -219,11 +219,11 @@ func (u *Uploader) uploadFile(file fs.File) (repo.ObjectID, error) {
|
||||
func (u *Uploader) uploadDir(dir fs.Directory) (repo.ObjectID, repo.ObjectID, error) {
|
||||
var err error
|
||||
|
||||
if err := u.repo.BeginPacking(); err != nil {
|
||||
if err := u.repo.Objects.BeginPacking(); err != nil {
|
||||
return repo.NullObjectID, repo.NullObjectID, err
|
||||
}
|
||||
|
||||
mw := u.repo.NewWriter(repo.WriterOptions{
|
||||
mw := u.repo.Objects.NewWriter(repo.WriterOptions{
|
||||
Description: "HASHCACHE:" + dir.Metadata().Name,
|
||||
BlockNamePrefix: "H",
|
||||
PackGroup: "HC",
|
||||
@@ -244,7 +244,7 @@ func (u *Uploader) uploadDir(dir fs.Directory) (repo.ObjectID, repo.ObjectID, er
|
||||
}
|
||||
|
||||
hcid, err := mw.Result()
|
||||
if err := u.repo.FinishPacking(); err != nil {
|
||||
if err := u.repo.Objects.FinishPacking(); err != nil {
|
||||
return repo.NullObjectID, repo.NullObjectID, fmt.Errorf("can't finish packing: %v", err)
|
||||
}
|
||||
return oid, hcid, err
|
||||
@@ -265,7 +265,7 @@ func uploadDirInternal(
|
||||
return repo.NullObjectID, err
|
||||
}
|
||||
|
||||
writer := u.repo.NewWriter(repo.WriterOptions{
|
||||
writer := u.repo.Objects.NewWriter(repo.WriterOptions{
|
||||
Description: "DIR:" + relativePath,
|
||||
PackGroup: "DIR",
|
||||
})
|
||||
@@ -399,7 +399,7 @@ func (u *Uploader) Upload(
|
||||
u.cacheReader = hashcache.Open(nil)
|
||||
u.stats = Stats{}
|
||||
if old != nil {
|
||||
if r, err := u.repo.Open(old.HashCacheID); err == nil {
|
||||
if r, err := u.repo.Objects.Open(old.HashCacheID); err == nil {
|
||||
u.cacheReader = hashcache.Open(r)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user