From: Kaushik Lingarkar Date: Thu, 2 Mar 2023 00:42:53 +0000 (-0800) Subject: RefDirectory.delete: Prevent failures when packed-refs is outdated X-Git-Tag: v6.6.0.202305031100-m2~40 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=5ae8d28faaf6168921f673c89a4e6d601ffad78d;p=jgit.git RefDirectory.delete: Prevent failures when packed-refs is outdated The in-memory copy of packed refs might be outdated by the time the packed-refs lock is acquired, so ensure the one read from disk is used after acquiring the lock to prevent commit packed-refs from throwing an exception. As a side-effect, since this updates the in-memory copy of packed-refs when it is re-read from disk, it can prevent other callers needing to re-read if it had changed. Change-Id: I724c866b330b397e955b5eb04b259eedd9911e93 Signed-off-by: Kaushik Lingarkar --- diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java index 32eb067d36..aa3989e481 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java @@ -673,16 +673,16 @@ public class RefDirectory extends RefDatabase { // Write the packed-refs file using an atomic update. We might // wind up reading it twice, before and after the lock, to ensure // we don't miss an edit made externally. - final PackedRefList packed = getPackedRefs(); + PackedRefList packed = getPackedRefs(); if (packed.contains(name)) { inProcessPackedRefsLock.lock(); try { LockFile lck = lockPackedRefsOrThrow(); try { - PackedRefList cur = readPackedRefs(); - int idx = cur.find(name); + packed = refreshPackedRefs(); + int idx = packed.find(name); if (0 <= idx) { - commitPackedRefs(lck, cur.remove(idx), packed, true); + commitPackedRefs(lck, packed.remove(idx), packed, true); } } finally { lck.unlock();