Merge "Revert "RevWalk: Store RevFilter metrics within a new RevFilterStats class""
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackedBatchRefUpdate.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackedBatchRefUpdate.java
index cd03600..12a7031 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackedBatchRefUpdate.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackedBatchRefUpdate.java
@@ -146,49 +146,52 @@ public void execute(RevWalk walk, ProgressMonitor monitor,
return;
}
- Map<String, LockFile> locks = null;
- LockFile packedRefsLock = null;
refdb.inProcessPackedRefsLock.lock();
try {
- // Pack refs normally, so we can create lock files even in the case
- // where refs/x is deleted and refs/x/y is created in this batch.
- refdb.pack(pending.stream().map(ReceiveCommand::getRefName)
- .collect(toList()));
-
- // During clone locking isn't needed since no refs exist yet.
- // This also helps to avoid problems with refs only differing in
- // case on a case insensitive filesystem (bug 528497)
- if (!refdb.isInClone() && shouldLockLooseRefs) {
- locks = lockLooseRefs(pending);
- if (locks == null) {
- return;
- }
- refdb.pack(locks);
- }
-
- packedRefsLock = refdb.lockPackedRefsOrThrow();
- PackedRefList oldPackedList = refdb.getLockedPackedRefs(packedRefsLock);
- RefList<Ref> newRefs = applyUpdates(walk, oldPackedList, pending);
- if (newRefs == null) {
- return;
- }
- refdb.commitPackedRefs(packedRefsLock, newRefs, oldPackedList,
- true, oldPackedList.traits());
- } catch (LockFailedException e) {
- lockFailure(pending.get(0), pending);
- return;
- } finally {
+ Map<String, LockFile> locks = null;
try {
- unlockAll(locks);
- if (packedRefsLock != null) {
- // This will be no-op if commitPackedRefs is successful as
- // it will remove the lock file (by renaming over real
- // file).
+ // Pack refs normally, so we can create lock files even in
+ // the case where refs/x is deleted and refs/x/y is created
+ // in this batch.
+ refdb.pack(pending.stream().map(ReceiveCommand::getRefName)
+ .collect(toList()));
+
+ // During clone locking isn't needed since no refs exist yet.
+ // This also helps to avoid problems with refs only differing
+ // in case on a case insensitive filesystem (bug 528497)
+ if (!refdb.isInClone() && shouldLockLooseRefs) {
+ locks = lockLooseRefs(pending);
+ if (locks == null) {
+ return;
+ }
+ refdb.pack(locks);
+ }
+
+ LockFile packedRefsLock = refdb.lockPackedRefsOrThrow();
+ try {
+ PackedRefList oldPackedList = refdb
+ .getLockedPackedRefs(packedRefsLock);
+ RefList<Ref> newRefs = applyUpdates(walk, oldPackedList,
+ pending);
+ if (newRefs == null) {
+ return;
+ }
+ refdb.commitPackedRefs(packedRefsLock, newRefs,
+ oldPackedList, true, oldPackedList.traits());
+ } finally {
+ // This will be no-op if commitPackedRefs is successful
+ // as it will remove the lock file (by renaming over
+ // real file).
packedRefsLock.unlock();
}
+ } catch (LockFailedException e) {
+ lockFailure(pending.get(0), pending);
+ return;
} finally {
- refdb.inProcessPackedRefsLock.unlock();
+ unlockAll(locks);
}
+ } finally {
+ refdb.inProcessPackedRefsLock.unlock();
}
refdb.fireRefsChanged();