diff options
author | Bruce Zu <bruce.zu@sonymobile.com> | 2013-12-13 17:09:11 +0800 |
---|---|---|
committer | David Pursehouse <david.pursehouse@sonymobile.com> | 2014-06-25 11:10:30 +0000 |
commit | d8090dc8a4d88c497b30320b913135296f6e6662 (patch) | |
tree | fc40eca354c8fdb658502d55f42c49f837fce641 | |
parent | c527b378f3c34ec75fd5b2051df19bec6d97de69 (diff) |
Executing CherryPick.writeCherryPickCommit() in a transaction.
This would at least allow the partial changes to the
database to rollback and not get users in a bad state when
e.g. in the case of OrmDuplicateKeyException: patch_set_ancestors'.
Bug: issue 2034
Bug: issue 2246
Change-Id: I65e111bedc3cec033299b5b5360aaee733d4b5c6
(cherry picked from commit eb4778d079e7156c82d04c2f26c71ca89d12df16)
-rw-r--r-- | gerrit-server/src/main/java/com/google/gerrit/server/git/CherryPick.java | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/CherryPick.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/CherryPick.java index 48f62b5966..259d939f48 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/git/CherryPick.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/CherryPick.java @@ -161,26 +161,36 @@ public class CherryPick extends SubmitStrategy { ps.setCreatedOn(TimeUtil.nowTs()); ps.setUploader(submitAudit.getAccountId()); ps.setRevision(new RevId(newCommit.getId().getName())); - insertAncestors(args.db, ps.getId(), newCommit); - args.db.patchSets().insert(Collections.singleton(ps)); - n.change.setCurrentPatchSet(patchSetInfoFactory.get(newCommit, ps.getId())); - args.db.changes().update(Collections.singletonList(n.change)); + final RefUpdate ru; - final List<PatchSetApproval> approvals = Lists.newArrayList(); - for (PatchSetApproval a : args.mergeUtil.getApprovalsForCommit(n)) { - approvals.add(new PatchSetApproval(ps.getId(), a)); - } - args.db.patchSetApprovals().insert(approvals); - - final RefUpdate ru = args.repo.updateRef(ps.getRefName()); - ru.setExpectedOldObjectId(ObjectId.zeroId()); - ru.setNewObjectId(newCommit); - ru.disableRefLog(); - if (ru.update(args.rw) != RefUpdate.Result.NEW) { - throw new IOException(String.format("Failed to create ref %s in %s: %s", - ps.getRefName(), n.change.getDest().getParentKey().get(), - ru.getResult())); + args.db.changes().beginTransaction(n.change.getId()); + try { + insertAncestors(args.db, ps.getId(), newCommit); + args.db.patchSets().insert(Collections.singleton(ps)); + n.change + .setCurrentPatchSet(patchSetInfoFactory.get(newCommit, ps.getId())); + args.db.changes().update(Collections.singletonList(n.change)); + + final List<PatchSetApproval> approvals = Lists.newArrayList(); + for (PatchSetApproval a : args.mergeUtil.getApprovalsForCommit(n)) { + approvals.add(new PatchSetApproval(ps.getId(), a)); + } + args.db.patchSetApprovals().insert(approvals); + + ru = args.repo.updateRef(ps.getRefName()); + ru.setExpectedOldObjectId(ObjectId.zeroId()); + ru.setNewObjectId(newCommit); + ru.disableRefLog(); + if (ru.update(args.rw) != RefUpdate.Result.NEW) { + throw new IOException(String.format( + "Failed to create ref %s in %s: %s", ps.getRefName(), n.change + .getDest().getParentKey().get(), ru.getResult())); + } + + args.db.commit(); + } finally { + args.db.rollback(); } gitRefUpdated.fire(n.change.getProject(), ru); |