summaryrefslogtreecommitdiff
path: root/refs
diff options
context:
space:
mode:
authorÆvar Arnfjörð Bjarmason <avarab@gmail.com>2021-08-23 13:36:09 +0200
committerJunio C Hamano <gitster@pobox.com>2021-08-25 13:27:37 -0700
commit7aa7829f754ab722d558e0408ec6f3dbf23ba70f (patch)
tree5fc085600d4ed49f1a74adb99feb74f857df46a7 /refs
parent6f45ec88d2168013b00b46d8593524ca5b6c0acb (diff)
downloadgit-7aa7829f754ab722d558e0408ec6f3dbf23ba70f.tar.gz
refs/files: add a comment about refs_reflog_exists() call
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>
Diffstat (limited to 'refs')
-rw-r--r--refs/files-backend.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/refs/files-backend.c b/refs/files-backend.c
index 997e021c1c..fbcd0c790b 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -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;