]> git.ipfire.org Git - thirdparty/git.git/commitdiff
refs/files: add a comment about refs_reflog_exists() call
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>
Mon, 23 Aug 2021 11:36:09 +0000 (13:36 +0200)
committerJunio C Hamano <gitster@pobox.com>
Wed, 25 Aug 2021 20:27:37 +0000 (13:27 -0700)
Add a comment about why it is that we need to check for the the
existence of a reflog we're deleting after we've successfully acquired
the lock in files_reflog_expire(). As noted in [1] the lock protocol
for reflogs is somewhat intuitive.

This early exit code the comment applies to dates all the way back to
4264dc15e19 (git reflog expire, 2006-12-19).

1. https://lore.kernel.org/git/54DCDA42.2060800@alum.mit.edu/

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
refs/files-backend.c

index 997e021c1c40a6cad83d3710e5c2fd8d8c75c8b4..fbcd0c790bcc4bae07385443937a75190d4b6b44 100644 (file)
@@ -3061,6 +3061,19 @@ static int files_reflog_expire(struct ref_store *ref_store,
                strbuf_release(&err);
                return -1;
        }
+
+       /*
+        * When refs are deleted, their reflog is deleted before the
+        * ref itself is deleted. This is because there is no separate
+        * lock for reflog; instead we take a lock on the ref with
+        * lock_ref_oid_basic().
+        *
+        * If a race happens and the reflog doesn't exist after we've
+        * acquired the lock that's OK. We've got nothing more to do;
+        * We were asked to delete the reflog, but someone else
+        * deleted it! The caller doesn't care that we deleted it,
+        * just that it is deleted. So we can return successfully.
+        */
        if (!refs_reflog_exists(ref_store, refname)) {
                unlock_ref(lock);
                return 0;