From 33af2cb98795e9fd2af1a301a839288b571d1efb Mon Sep 17 00:00:00 2001 From: Andy Arthur Date: Sun, 21 Feb 2021 13:27:35 -0800 Subject: [PATCH] save active merge commit during GC --- go/cmd/dolt/commands/gc.go | 18 ++++++++++--- go/libraries/doltcore/env/repo_state.go | 14 +++++++++++ .../doltcore/mvdata/table_data_loc.go | 25 ++++++++++++++----- 3 files changed, 48 insertions(+), 9 deletions(-) diff --git a/go/cmd/dolt/commands/gc.go b/go/cmd/dolt/commands/gc.go index 97fbf58b77..e0050352cf 100644 --- a/go/cmd/dolt/commands/gc.go +++ b/go/cmd/dolt/commands/gc.go @@ -17,6 +17,8 @@ package commands import ( "context" + "github.com/dolthub/dolt/go/store/hash" + "github.com/dolthub/dolt/go/cmd/dolt/cli" "github.com/dolthub/dolt/go/cmd/dolt/errhand" eventsapi "github.com/dolthub/dolt/go/gen/proto/dolt/services/eventsapi/v1alpha1" @@ -114,11 +116,21 @@ func (cmd GarbageCollectionCmd) Exec(ctx context.Context, commandStr string, arg return HandleVErrAndExitCode(verr, usage) } - w := dEnv.RepoState.WorkingHash() - s := dEnv.RepoState.StagedHash() + keepers := []hash.Hash{ + dEnv.RepoState.WorkingHash(), + dEnv.RepoState.StagedHash(), + } - err = dEnv.DoltDB.GC(ctx, w, s) + if dEnv.IsMergeActive() { + m, err := env.ResolveMergeCommitHash(ctx, dEnv.RepoStateReader(), dEnv.DoltDB) + if err != nil { + verr = errhand.BuildDError("an error occurred while saving an active merge commit").AddCause(err).Build() + return HandleVErrAndExitCode(verr, usage) + } + keepers = append(keepers, m) + } + err = dEnv.DoltDB.GC(ctx, keepers...) if err != nil { verr = errhand.BuildDError("an error occurred during garbage collection").AddCause(err).Build() } diff --git a/go/libraries/doltcore/env/repo_state.go b/go/libraries/doltcore/env/repo_state.go index daa29955b5..33e92349c3 100644 --- a/go/libraries/doltcore/env/repo_state.go +++ b/go/libraries/doltcore/env/repo_state.go @@ -340,6 +340,20 @@ func MergeWouldStompChanges(ctx context.Context, mergeCommit *doltdb.Commit, dbD return stompedTables, headWorkingDiffs, nil } +func ResolveMergeCommitHash(ctx context.Context, rsr RepoStateReader, ddb *doltdb.DoltDB) (h hash.Hash, err error) { + spec, err := doltdb.NewCommitSpec(rsr.GetMergeCommit()) + if err != nil { + return h, err + } + + cm, err := ddb.Resolve(ctx, spec, nil) + if err != nil { + return h, err + } + + return cm.HashOf() +} + func mapTableHashes(ctx context.Context, root *doltdb.RootValue) (map[string]hash.Hash, error) { names, err := root.GetTableNames(ctx) diff --git a/go/libraries/doltcore/mvdata/table_data_loc.go b/go/libraries/doltcore/mvdata/table_data_loc.go index 379d5e9dad..98c03e799b 100644 --- a/go/libraries/doltcore/mvdata/table_data_loc.go +++ b/go/libraries/doltcore/mvdata/table_data_loc.go @@ -19,6 +19,8 @@ import ( "errors" "sync/atomic" + "github.com/dolthub/dolt/go/store/hash" + "github.com/dolthub/dolt/go/libraries/doltcore/doltdb" "github.com/dolthub/dolt/go/libraries/doltcore/env" "github.com/dolthub/dolt/go/libraries/doltcore/row" @@ -278,20 +280,31 @@ func (te *tableEditorWriteCloser) GC(ctx context.Context) error { return nil } - w := te.dEnv.RepoState.WorkingHash() - s := te.dEnv.RepoState.StagedHash() - - inProgresRoot, err := te.sess.Flush(ctx) + inProgressRoot, err := te.sess.Flush(ctx) if err != nil { return err } - i, err := te.dEnv.DoltDB.WriteRootValue(ctx, inProgresRoot) + inProgressHash, err := te.dEnv.DoltDB.WriteRootValue(ctx, inProgressRoot) if err != nil { return err } - return te.dEnv.DoltDB.GC(ctx, w, s, i) + keepers := []hash.Hash{ + te.dEnv.RepoState.WorkingHash(), + te.dEnv.RepoState.StagedHash(), + inProgressHash, + } + + if te.dEnv.IsMergeActive() { + m, err := env.ResolveMergeCommitHash(ctx, te.dEnv.RepoStateReader(), te.dEnv.DoltDB) + if err != nil { + return err + } + keepers = append(keepers, m) + } + + return te.dEnv.DoltDB.GC(ctx, keepers...) } // Close implements TableWriteCloser