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
4264dc15e1
(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>
This commit is contained in:
parent
6f45ec88d2
commit
7aa7829f75
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user