mirror of https://github.com/restic/restic.git
Make `rebuild-index` use the code in package repository
This commit is contained in:
parent
00139648a0
commit
fa26ecc8f9
|
@ -1,14 +1,6 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import "restic/repository"
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"restic/backend"
|
|
||||||
"restic/debug"
|
|
||||||
"restic/pack"
|
|
||||||
"restic/repository"
|
|
||||||
"restic/worker"
|
|
||||||
)
|
|
||||||
|
|
||||||
type CmdRebuildIndex struct {
|
type CmdRebuildIndex struct {
|
||||||
global *GlobalOptions
|
global *GlobalOptions
|
||||||
|
@ -26,94 +18,6 @@ func init() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const rebuildIndexWorkers = 10
|
|
||||||
|
|
||||||
func loadBlobsFromPacks(repo *repository.Repository) (packs map[backend.ID][]pack.Blob) {
|
|
||||||
done := make(chan struct{})
|
|
||||||
defer close(done)
|
|
||||||
|
|
||||||
f := func(job worker.Job, done <-chan struct{}) (interface{}, error) {
|
|
||||||
return repo.ListPack(job.Data.(backend.ID))
|
|
||||||
}
|
|
||||||
|
|
||||||
jobCh := make(chan worker.Job)
|
|
||||||
resCh := make(chan worker.Job)
|
|
||||||
wp := worker.New(rebuildIndexWorkers, f, jobCh, resCh)
|
|
||||||
|
|
||||||
go func() {
|
|
||||||
for id := range repo.List(backend.Data, done) {
|
|
||||||
jobCh <- worker.Job{Data: id}
|
|
||||||
}
|
|
||||||
close(jobCh)
|
|
||||||
}()
|
|
||||||
|
|
||||||
packs = make(map[backend.ID][]pack.Blob)
|
|
||||||
for job := range resCh {
|
|
||||||
id := job.Data.(backend.ID)
|
|
||||||
|
|
||||||
if job.Error != nil {
|
|
||||||
fmt.Fprintf(os.Stderr, "error for pack %v: %v\n", id, job.Error)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
entries := job.Result.([]pack.Blob)
|
|
||||||
packs[id] = entries
|
|
||||||
}
|
|
||||||
|
|
||||||
wp.Wait()
|
|
||||||
|
|
||||||
return packs
|
|
||||||
}
|
|
||||||
|
|
||||||
func listIndexIDs(repo *repository.Repository) (list backend.IDs) {
|
|
||||||
done := make(chan struct{})
|
|
||||||
for id := range repo.List(backend.Index, done) {
|
|
||||||
list = append(list, id)
|
|
||||||
}
|
|
||||||
|
|
||||||
return list
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cmd CmdRebuildIndex) rebuildIndex() error {
|
|
||||||
debug.Log("RebuildIndex.RebuildIndex", "start rebuilding index")
|
|
||||||
|
|
||||||
packs := loadBlobsFromPacks(cmd.repo)
|
|
||||||
cmd.global.Verbosef("loaded blobs from %d packs\n", len(packs))
|
|
||||||
|
|
||||||
idx := repository.NewIndex()
|
|
||||||
for packID, entries := range packs {
|
|
||||||
for _, entry := range entries {
|
|
||||||
pb := repository.PackedBlob{
|
|
||||||
ID: entry.ID,
|
|
||||||
Type: entry.Type,
|
|
||||||
Length: entry.Length,
|
|
||||||
Offset: entry.Offset,
|
|
||||||
PackID: packID,
|
|
||||||
}
|
|
||||||
idx.Store(pb)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
oldIndexes := listIndexIDs(cmd.repo)
|
|
||||||
idx.AddToSupersedes(oldIndexes...)
|
|
||||||
cmd.global.Printf(" saving new index\n")
|
|
||||||
id, err := repository.SaveIndex(cmd.repo, idx)
|
|
||||||
if err != nil {
|
|
||||||
debug.Log("RebuildIndex.RebuildIndex", "error saving index: %v", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
debug.Log("RebuildIndex.RebuildIndex", "new index saved as %v", id.Str())
|
|
||||||
|
|
||||||
for _, indexID := range oldIndexes {
|
|
||||||
err := cmd.repo.Backend().Remove(backend.Index, indexID.String())
|
|
||||||
if err != nil {
|
|
||||||
cmd.global.Warnf("unable to remove index %v: %v\n", indexID.Str(), err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cmd CmdRebuildIndex) Execute(args []string) error {
|
func (cmd CmdRebuildIndex) Execute(args []string) error {
|
||||||
repo, err := cmd.global.OpenRepository()
|
repo, err := cmd.global.OpenRepository()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -127,5 +31,5 @@ func (cmd CmdRebuildIndex) Execute(args []string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return cmd.rebuildIndex()
|
return repository.RebuildIndex(repo)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue