]> source.dussan.org Git - jgit.git/commitdiff
RefDirectory.delete: Prevent failures when packed-refs is outdated 68/200368/6
authorKaushik Lingarkar <quic_kaushikl@quicinc.com>
Thu, 2 Mar 2023 00:42:53 +0000 (16:42 -0800)
committerMatthias Sohn <matthias.sohn@sap.com>
Thu, 30 Mar 2023 20:32:50 +0000 (22:32 +0200)
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 <quic_kaushikl@quicinc.com>
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/RefDirectory.java

index 32eb067d36da89baa3877ce4dac9ae9313c9fd09..aa3989e48185fe17c990b3be1d2ca1ab70b71aee 100644 (file)
@@ -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();