From dbababdff528cd40a168127577dea3a437022ddb Mon Sep 17 00:00:00 2001 From: Zach Musgrave Date: Tue, 20 Sep 2022 17:54:40 -0700 Subject: [PATCH] Fixed concurrency bug with dolt_commit() --- go/libraries/doltcore/doltdb/commit.go | 14 +------------- .../doltcore/sqle/dsess/transactions.go | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/go/libraries/doltcore/doltdb/commit.go b/go/libraries/doltcore/doltdb/commit.go index df67e05a75..d7b7ee9e05 100644 --- a/go/libraries/doltcore/doltdb/commit.go +++ b/go/libraries/doltcore/doltdb/commit.go @@ -231,21 +231,9 @@ func (ddb *DoltDB) NewPendingCommit( } roots.Staged = newstaged - ds, err := ddb.db.GetDataset(ctx, headRef.String()) - if err != nil { - return nil, err - } - - nomsHeadAddr, hasHead := ds.MaybeHeadAddr() var parents []hash.Hash - if hasHead { - parents = append(parents, nomsHeadAddr) - } - for _, pc := range parentCommits { - if pc.dCommit.Addr() != nomsHeadAddr { - parents = append(parents, pc.dCommit.Addr()) - } + parents = append(parents, pc.dCommit.Addr()) } commitOpts := datas.CommitOptions{Parents: parents, Meta: cm} diff --git a/go/libraries/doltcore/sqle/dsess/transactions.go b/go/libraries/doltcore/sqle/dsess/transactions.go index 9d79b2243c..5f21363a6f 100644 --- a/go/libraries/doltcore/sqle/dsess/transactions.go +++ b/go/libraries/doltcore/sqle/dsess/transactions.go @@ -141,15 +141,29 @@ func doltCommit(ctx *sql.Context, tx *DoltTransaction, commit *doltdb.PendingCommit, workingSet *doltdb.WorkingSet, - hash hash.Hash, + currHash hash.Hash, ) (*doltdb.WorkingSet, *doltdb.Commit, error) { headRef, err := workingSet.Ref().ToHeadRef() if err != nil { return nil, nil, err } + cm, err := tx.dbData.Ddb.ResolveCommitRef(ctx, headRef) + // TODO: branch not found? + if err != nil { + return nil, nil, err + } + + // TODO: dumb to resolve just to get a hash, wasted effort + headHash, err := cm.HashOf() + if err != nil { + return nil, nil, err + } + + commit.CommitOptions.Parents = append(append([]hash.Hash{}, headHash), commit.CommitOptions.Parents...) + workingSet = workingSet.ClearMerge() - newCommit, err := tx.dbData.Ddb.CommitWithWorkingSet(ctx, headRef, tx.workingSetRef, commit, workingSet, hash, tx.getWorkingSetMeta(ctx)) + newCommit, err := tx.dbData.Ddb.CommitWithWorkingSet(ctx, headRef, tx.workingSetRef, commit, workingSet, currHash, tx.getWorkingSetMeta(ctx)) return workingSet, newCommit, err }