From d050f9c11095cdbdb29f8d039d6c3de447bf6fed Mon Sep 17 00:00:00 2001 From: Andy Arthur Date: Mon, 12 Oct 2020 18:12:07 -0700 Subject: [PATCH] pr feedback, added visited set to traversal --- bats/garbage_collection.bats | 2 ++ go/libraries/doltcore/doltdb/doltdb.go | 17 ++++------------- go/store/types/value_store.go | 5 +++++ 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/bats/garbage_collection.bats b/bats/garbage_collection.bats index 7fdedf3c46..9cb9e10988 100644 --- a/bats/garbage_collection.bats +++ b/bats/garbage_collection.bats @@ -128,5 +128,7 @@ SQL AFTER=$(du .dolt/noms/ | sed 's/[^0-9]*//g') # assert space was reclaimed + echo "$BEFORE" + echo "$AFTER" [ "$BEFORE" -gt "$AFTER" ] } diff --git a/go/libraries/doltcore/doltdb/doltdb.go b/go/libraries/doltcore/doltdb/doltdb.go index 2877ae85a2..c82796be93 100644 --- a/go/libraries/doltcore/doltdb/doltdb.go +++ b/go/libraries/doltcore/doltdb/doltdb.go @@ -18,6 +18,7 @@ import ( "context" "errors" "fmt" + "math/rand" "strings" "time" @@ -25,7 +26,6 @@ import ( "github.com/dolthub/dolt/go/libraries/doltcore/ref" "github.com/dolthub/dolt/go/libraries/utils/filesys" "github.com/dolthub/dolt/go/libraries/utils/pantoerr" - "github.com/dolthub/dolt/go/libraries/utils/set" "github.com/dolthub/dolt/go/store/chunks" "github.com/dolthub/dolt/go/store/datas" "github.com/dolthub/dolt/go/store/hash" @@ -921,6 +921,7 @@ func (ddb *DoltDB) GC(ctx context.Context, uncommitedVals ...hash.Hash) error { return err } + rand.Seed(time.Now().UnixNano()) tmpDatasets := make([]datas.Dataset, len(uncommitedVals)) for i, h := range uncommitedVals { v, err := ddb.db.ReadValue(ctx, h) @@ -931,7 +932,7 @@ func (ddb *DoltDB) GC(ctx context.Context, uncommitedVals ...hash.Hash) error { return fmt.Errorf("empty value for value hash %s", h.String()) } - ds, err := ddb.db.GetDataset(ctx, fmt.Sprintf("tmp/%d", time.Now().UnixNano())) + ds, err := ddb.db.GetDataset(ctx, fmt.Sprintf("tmp/%d", rand.Int63())) if err != nil { return err } @@ -972,16 +973,6 @@ func (ddb *DoltDB) GC(ctx context.Context, uncommitedVals ...hash.Hash) error { } func (ddb *DoltDB) pruneUnreferencedDatasets(ctx context.Context) error { - rr, err := ddb.GetRefs(ctx) - if err != nil { - return err - } - - refs := set.NewStrSet(nil) - for _, r := range rr { - refs.Add(r.String()) - } - dd, err := ddb.db.Datasets(ctx) if err != nil { return err @@ -990,7 +981,7 @@ func (ddb *DoltDB) pruneUnreferencedDatasets(ctx context.Context) error { var deletes []string _ = dd.Iter(ctx, func(ds, _ types.Value) (stop bool, err error) { dsID := string(ds.(types.String)) - if !refs.Contains(dsID) { + if !ref.IsRef(dsID) { deletes = append(deletes, dsID) } return false, nil diff --git a/go/store/types/value_store.go b/go/store/types/value_store.go index 4dfe09ca69..80d6fcae66 100644 --- a/go/store/types/value_store.go +++ b/go/store/types/value_store.go @@ -599,6 +599,7 @@ func (lvs *ValueStore) GC(ctx context.Context) error { return err } hashQueue := list.New() + visited := hash.NewHashSet(root) hashQueue.PushBack(root) for hashQueue.Len() > 0 { e := hashQueue.Front() @@ -615,11 +616,15 @@ func (lvs *ValueStore) GC(ctx context.Context) error { err = val.WalkRefs(lvs.nbf, func(reachable Ref) error { h := reachable.TargetHash() + if visited.Has(h) { + return nil + } err := sendHash(h) if err != nil { return err } hashQueue.PushBack(h) + visited.Insert(h) return nil }) if err != nil {