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
This commit is contained in:
Shawn O. Pearce
2012-06-14 14:05:51 -07:00
parent 8560847b7a
commit 39c56713ce

View File

@@ -255,10 +255,24 @@ class PatchListLoader extends CacheLoader<PatchListKey, PatchList> {
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 {