From 39c56713ce97defb332da601ce282b4ba2eca96c Mon Sep 17 00:00:00 2001 From: "Shawn O. Pearce" Date: Thu, 14 Jun 2012 14:05:51 -0700 Subject: [PATCH] Don't allow Merger to release the ObjectInserter in PatchListLoader When a Merger writes out some objects, but then aborts because it detects a conflict, it releases its ObjectInserter. If the inserter isn't for the local filesystem, but is a more "exotic" type like the DfsObjectInserter that buffers data in memory before flushing to disk, Gerrit loses the successful merge results that did complete. Override flush and release in the Merger so these are no-ops, but otherwise delegate all activity to the inserter managed already in the existing try/finally block. This way when a conflict is detected and Gerrit auto-resolves it by creating the version with markers embedded within the operation can still complete. Change-Id: I86f2cb5cc2f1506444530879058661d1dcb56c1f --- .../gerrit/server/patch/PatchListLoader.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListLoader.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListLoader.java index d6e84bb0fb..d27c205e47 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListLoader.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchListLoader.java @@ -255,10 +255,24 @@ class PatchListLoader extends CacheLoader { ObjectId treeId; ResolveMerger m = (ResolveMerger) MergeStrategy.RESOLVE.newMerger(repo, true); - ObjectInserter ins = m.getObjectInserter(); + final ObjectInserter ins = repo.newObjectInserter(); try { DirCache dc = DirCache.newInCore(); m.setDirCache(dc); + m.setObjectInserter(new ObjectInserter.Filter() { + @Override + protected ObjectInserter delegate() { + return ins; + } + + @Override + public void flush() { + } + + @Override + public void release() { + } + }); boolean couldMerge = false; try {