mirror of
https://github.com/octoleo/restic.git
synced 2024-11-25 14:17:42 +00:00
repository: Remove pack implementation details from MasterIndex
This commit is contained in:
parent
dc3d77dacc
commit
f78bd14e28
@ -8,6 +8,7 @@ import (
|
|||||||
|
|
||||||
"github.com/restic/restic/internal/debug"
|
"github.com/restic/restic/internal/debug"
|
||||||
"github.com/restic/restic/internal/errors"
|
"github.com/restic/restic/internal/errors"
|
||||||
|
"github.com/restic/restic/internal/pack"
|
||||||
"github.com/restic/restic/internal/repository"
|
"github.com/restic/restic/internal/repository"
|
||||||
"github.com/restic/restic/internal/restic"
|
"github.com/restic/restic/internal/restic"
|
||||||
|
|
||||||
@ -245,7 +246,7 @@ func prune(opts PruneOptions, gopts GlobalOptions, repo restic.Repository, usedB
|
|||||||
indexPack := make(map[restic.ID]packInfo)
|
indexPack := make(map[restic.ID]packInfo)
|
||||||
|
|
||||||
// save computed pack header size
|
// save computed pack header size
|
||||||
for pid, hdrSize := range repo.Index().PackSize(ctx, true) {
|
for pid, hdrSize := range pack.Size(ctx, repo.Index(), true) {
|
||||||
// initialize tpe with NumBlobTypes to indicate it's not set
|
// initialize tpe with NumBlobTypes to indicate it's not set
|
||||||
indexPack[pid] = packInfo{tpe: restic.NumBlobTypes, usedSize: uint64(hdrSize)}
|
indexPack[pid] = packInfo{tpe: restic.NumBlobTypes, usedSize: uint64(hdrSize)}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/restic/restic/internal/pack"
|
||||||
"github.com/restic/restic/internal/repository"
|
"github.com/restic/restic/internal/repository"
|
||||||
"github.com/restic/restic/internal/restic"
|
"github.com/restic/restic/internal/restic"
|
||||||
|
|
||||||
@ -97,7 +98,7 @@ func rebuildIndex(opts RebuildIndexOptions, gopts GlobalOptions, repo *repositor
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
packSizeFromIndex = repo.Index().PackSize(ctx, false)
|
packSizeFromIndex = pack.Size(ctx, repo.Index(), false)
|
||||||
}
|
}
|
||||||
|
|
||||||
Verbosef("getting pack files to read...\n")
|
Verbosef("getting pack files to read...\n")
|
||||||
|
@ -123,7 +123,7 @@ func (c *Checker) LoadIndex(ctx context.Context) (hints []error, errs []error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// compute pack size using index entries
|
// compute pack size using index entries
|
||||||
c.packs = c.masterIndex.PackSize(ctx, false)
|
c.packs = pack.Size(ctx, c.masterIndex, false)
|
||||||
|
|
||||||
debug.Log("checking for duplicate packs")
|
debug.Log("checking for duplicate packs")
|
||||||
for packID := range c.packs {
|
for packID := range c.packs {
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package pack
|
package pack
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
@ -317,3 +318,28 @@ func parseHeaderEntry(p []byte) (b restic.Blob, err error) {
|
|||||||
|
|
||||||
return b, nil
|
return b, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func CalculateHeaderSize(blobs []restic.Blob) int {
|
||||||
|
return HeaderSize + len(blobs)*int(EntrySize)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Size returns the size of all packs computed by index information.
|
||||||
|
// If onlyHdr is set to true, only the size of the header is returned
|
||||||
|
// Note that this function only gives correct sizes, if there are no
|
||||||
|
// duplicates in the index.
|
||||||
|
func Size(ctx context.Context, mi restic.MasterIndex, onlyHdr bool) map[restic.ID]int64 {
|
||||||
|
packSize := make(map[restic.ID]int64)
|
||||||
|
|
||||||
|
for blob := range mi.Each(ctx) {
|
||||||
|
size, ok := packSize[blob.PackID]
|
||||||
|
if !ok {
|
||||||
|
size = HeaderSize
|
||||||
|
}
|
||||||
|
if !onlyHdr {
|
||||||
|
size += int64(blob.Length)
|
||||||
|
}
|
||||||
|
packSize[blob.PackID] = size + int64(EntrySize)
|
||||||
|
}
|
||||||
|
|
||||||
|
return packSize
|
||||||
|
}
|
||||||
|
@ -6,7 +6,6 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/restic/restic/internal/debug"
|
"github.com/restic/restic/internal/debug"
|
||||||
"github.com/restic/restic/internal/pack"
|
|
||||||
"github.com/restic/restic/internal/restic"
|
"github.com/restic/restic/internal/restic"
|
||||||
"github.com/restic/restic/internal/ui/progress"
|
"github.com/restic/restic/internal/ui/progress"
|
||||||
"golang.org/x/sync/errgroup"
|
"golang.org/x/sync/errgroup"
|
||||||
@ -131,27 +130,6 @@ func (mi *MasterIndex) Packs(packBlacklist restic.IDSet) restic.IDSet {
|
|||||||
return packs
|
return packs
|
||||||
}
|
}
|
||||||
|
|
||||||
// PackSize returns the size of all packs computed by index information.
|
|
||||||
// If onlyHdr is set to true, only the size of the header is returned
|
|
||||||
// Note that this function only gives correct sizes, if there are no
|
|
||||||
// duplicates in the index.
|
|
||||||
func (mi *MasterIndex) PackSize(ctx context.Context, onlyHdr bool) map[restic.ID]int64 {
|
|
||||||
packSize := make(map[restic.ID]int64)
|
|
||||||
|
|
||||||
for blob := range mi.Each(ctx) {
|
|
||||||
size, ok := packSize[blob.PackID]
|
|
||||||
if !ok {
|
|
||||||
size = pack.HeaderSize
|
|
||||||
}
|
|
||||||
if !onlyHdr {
|
|
||||||
size += int64(blob.Length)
|
|
||||||
}
|
|
||||||
packSize[blob.PackID] = size + int64(pack.EntrySize)
|
|
||||||
}
|
|
||||||
|
|
||||||
return packSize
|
|
||||||
}
|
|
||||||
|
|
||||||
// Count returns the number of blobs of type t in the index.
|
// Count returns the number of blobs of type t in the index.
|
||||||
func (mi *MasterIndex) Count(t restic.BlobType) (n uint) {
|
func (mi *MasterIndex) Count(t restic.BlobType) (n uint) {
|
||||||
mi.idxMutex.RLock()
|
mi.idxMutex.RLock()
|
||||||
|
@ -70,7 +70,6 @@ type MasterIndex interface {
|
|||||||
Has(BlobHandle) bool
|
Has(BlobHandle) bool
|
||||||
Lookup(BlobHandle) []PackedBlob
|
Lookup(BlobHandle) []PackedBlob
|
||||||
Count(BlobType) uint
|
Count(BlobType) uint
|
||||||
PackSize(ctx context.Context, onlyHdr bool) map[ID]int64
|
|
||||||
|
|
||||||
// Each returns a channel that yields all blobs known to the index. When
|
// Each returns a channel that yields all blobs known to the index. When
|
||||||
// the context is cancelled, the background goroutine terminates. This
|
// the context is cancelled, the background goroutine terminates. This
|
||||||
|
Loading…
Reference in New Issue
Block a user