mirror of
https://github.com/octoleo/restic.git
synced 2024-12-23 11:28:54 +00:00
Add Index.ListPack()
This commit is contained in:
parent
484331cd8d
commit
89a77ab2f9
@ -132,6 +132,26 @@ func (idx *Index) Lookup(id backend.ID) (pb PackedBlob, err error) {
|
|||||||
return PackedBlob{}, fmt.Errorf("id %v not found in index", id)
|
return PackedBlob{}, fmt.Errorf("id %v not found in index", id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ListPack returns a list of blobs contained in a pack.
|
||||||
|
func (idx *Index) ListPack(id backend.ID) (list []PackedBlob) {
|
||||||
|
idx.m.Lock()
|
||||||
|
defer idx.m.Unlock()
|
||||||
|
|
||||||
|
for blobID, entry := range idx.pack {
|
||||||
|
if entry.packID == id {
|
||||||
|
list = append(list, PackedBlob{
|
||||||
|
ID: blobID,
|
||||||
|
Type: entry.tpe,
|
||||||
|
Length: entry.length,
|
||||||
|
Offset: entry.offset,
|
||||||
|
PackID: entry.packID,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return list
|
||||||
|
}
|
||||||
|
|
||||||
// Has returns true iff the id is listed in the index.
|
// Has returns true iff the id is listed in the index.
|
||||||
func (idx *Index) Has(id backend.ID) bool {
|
func (idx *Index) Has(id backend.ID) bool {
|
||||||
_, err := idx.Lookup(id)
|
_, err := idx.Lookup(id)
|
||||||
|
@ -240,6 +240,18 @@ var exampleTests = []struct {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var exampleLookupTest = struct {
|
||||||
|
packID backend.ID
|
||||||
|
blobs backend.IDSet
|
||||||
|
}{
|
||||||
|
ParseID("73d04e6125cf3c28a299cc2f3cca3b78ceac396e4fcf9575e34536b26782413c"),
|
||||||
|
backend.IDSet{
|
||||||
|
ParseID("3ec79977ef0cf5de7b08cd12b874cd0f62bbaf7f07f3497a5b1bbcc8cb39b1ce"): struct{}{},
|
||||||
|
ParseID("9ccb846e60d90d4eb915848add7aa7ea1e4bbabfc60e573db9f7bfb2789afbae"): struct{}{},
|
||||||
|
ParseID("d3dc577b4ffd38cc4b32122cabf8655a0223ed22edfd93b353dc0c3f2b0fdf66"): struct{}{},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
func TestIndexUnserialize(t *testing.T) {
|
func TestIndexUnserialize(t *testing.T) {
|
||||||
oldIdx := backend.IDs{ParseID("ed54ae36197f4745ebc4b54d10e0f623eaaaedd03013eb7ae90df881b7781452")}
|
oldIdx := backend.IDs{ParseID("ed54ae36197f4745ebc4b54d10e0f623eaaaedd03013eb7ae90df881b7781452")}
|
||||||
|
|
||||||
@ -257,6 +269,17 @@ func TestIndexUnserialize(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Equals(t, oldIdx, idx.Supersedes())
|
Equals(t, oldIdx, idx.Supersedes())
|
||||||
|
|
||||||
|
blobs := idx.ListPack(exampleLookupTest.packID)
|
||||||
|
if len(blobs) != len(exampleLookupTest.blobs) {
|
||||||
|
t.Fatalf("expected %d blobs in pack, got %d", len(exampleLookupTest.blobs), len(blobs))
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, blob := range blobs {
|
||||||
|
if !exampleLookupTest.blobs.Has(blob.ID) {
|
||||||
|
t.Errorf("unexpected blob %v found", blob.ID.Str())
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestIndexUnserializeOld(t *testing.T) {
|
func TestIndexUnserializeOld(t *testing.T) {
|
||||||
|
@ -67,6 +67,22 @@ func (mi *MasterIndex) LookupSize(id backend.ID) (uint, error) {
|
|||||||
return 0, fmt.Errorf("id %v not found in any index", id)
|
return 0, fmt.Errorf("id %v not found in any index", id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ListPack returns the list of blobs in a pack. The first matching index is
|
||||||
|
// returned, or nil if no index contains information about the pack id.
|
||||||
|
func (mi *MasterIndex) ListPack(id backend.ID) (list []PackedBlob) {
|
||||||
|
mi.idxMutex.RLock()
|
||||||
|
defer mi.idxMutex.RUnlock()
|
||||||
|
|
||||||
|
for _, idx := range mi.idx {
|
||||||
|
list := idx.ListPack(id)
|
||||||
|
if len(list) > 0 {
|
||||||
|
return list
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Has queries all known Indexes for the ID and returns the first match.
|
// Has queries all known Indexes for the ID and returns the first match.
|
||||||
func (mi *MasterIndex) Has(id backend.ID) bool {
|
func (mi *MasterIndex) Has(id backend.ID) bool {
|
||||||
mi.idxMutex.RLock()
|
mi.idxMutex.RLock()
|
||||||
|
Loading…
Reference in New Issue
Block a user