forked from TrueCloudLab/restic
Add ID handling for index
This commit is contained in:
parent
60a34087c9
commit
f3f84b1544
3 changed files with 43 additions and 2 deletions
|
@ -19,7 +19,8 @@ type Index struct {
|
||||||
m sync.Mutex
|
m sync.Mutex
|
||||||
pack map[backend.ID]indexEntry
|
pack map[backend.ID]indexEntry
|
||||||
|
|
||||||
final bool // set to true for all indexes read from the backend ("finalized")
|
final bool // set to true for all indexes read from the backend ("finalized")
|
||||||
|
id backend.ID // set to the ID of the index when it's finalized
|
||||||
supersedes backend.IDs
|
supersedes backend.IDs
|
||||||
created time.Time
|
created time.Time
|
||||||
}
|
}
|
||||||
|
@ -395,6 +396,39 @@ func (idx *Index) Finalize(w io.Writer) error {
|
||||||
return idx.encode(w)
|
return idx.encode(w)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ID returns the ID of the index, if available. If the index is not yet
|
||||||
|
// finalized, an error is returned.
|
||||||
|
func (idx *Index) ID() (backend.ID, error) {
|
||||||
|
idx.m.Lock()
|
||||||
|
defer idx.m.Unlock()
|
||||||
|
|
||||||
|
if !idx.final {
|
||||||
|
return backend.ID{}, errors.New("index not finalized")
|
||||||
|
}
|
||||||
|
|
||||||
|
return idx.id, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SetID sets the ID the index has been written to. This requires that
|
||||||
|
// Finalize() has been called before, otherwise an error is returned.
|
||||||
|
func (idx *Index) SetID(id backend.ID) error {
|
||||||
|
idx.m.Lock()
|
||||||
|
defer idx.m.Unlock()
|
||||||
|
|
||||||
|
if !idx.final {
|
||||||
|
return errors.New("indexs is not final")
|
||||||
|
}
|
||||||
|
|
||||||
|
if !idx.id.IsNull() {
|
||||||
|
return errors.New("ID already set")
|
||||||
|
}
|
||||||
|
|
||||||
|
debug.Log("Index.SetID", "ID set to %v", id.Str())
|
||||||
|
idx.id = id
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// Dump writes the pretty-printed JSON representation of the index to w.
|
// Dump writes the pretty-printed JSON representation of the index to w.
|
||||||
func (idx *Index) Dump(w io.Writer) error {
|
func (idx *Index) Dump(w io.Writer) error {
|
||||||
debug.Log("Index.Dump", "dumping index")
|
debug.Log("Index.Dump", "dumping index")
|
||||||
|
|
|
@ -117,6 +117,12 @@ func TestIndexSerialize(t *testing.T) {
|
||||||
Assert(t, idx.Final(),
|
Assert(t, idx.Final(),
|
||||||
"index not final after encoding")
|
"index not final after encoding")
|
||||||
|
|
||||||
|
id := randomID()
|
||||||
|
idx.SetID(id)
|
||||||
|
id2, err := idx.ID()
|
||||||
|
Assert(t, id2.Equal(id),
|
||||||
|
"wrong ID returned: want %v, got %v", id, id2)
|
||||||
|
|
||||||
idx3, err := repository.DecodeIndex(wr3)
|
idx3, err := repository.DecodeIndex(wr3)
|
||||||
OK(t, err)
|
OK(t, err)
|
||||||
Assert(t, idx3 != nil,
|
Assert(t, idx3 != nil,
|
||||||
|
|
|
@ -526,7 +526,8 @@ func SaveIndex(repo *Repository, index *Index) (backend.ID, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
sid := blob.ID()
|
sid := blob.ID()
|
||||||
return sid, nil
|
err = index.SetID(sid)
|
||||||
|
return sid, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// saveIndex saves all indexes in the backend.
|
// saveIndex saves all indexes in the backend.
|
||||||
|
|
Loading…
Reference in a new issue