Merge branch 'sc/pack-refs-deletion-racefix'

"git pack-refs" can lose refs that are created while running, which
is getting corrected.

* sc/pack-refs-deletion-racefix:
  pack-refs: always refresh after taking the lock file
This commit is contained in:
Junio C Hamano 2019-08-22 12:34:10 -07:00
commit 207ad3cb20
1 changed files with 16 additions and 7 deletions

View File

@ -1012,14 +1012,23 @@ int packed_refs_lock(struct ref_store *ref_store, int flags, struct strbuf *err)
} }
/* /*
* Now that we hold the `packed-refs` lock, make sure that our * There is a stat-validity problem might cause `update-ref -d`
* snapshot matches the current version of the file. Normally * lost the newly commit of a ref, because a new `packed-refs`
* `get_snapshot()` does that for us, but that function * file might has the same on-disk file attributes such as
* assumes that when the file is locked, any existing snapshot * timestamp, file size and inode value, but has a changed
* is still valid. We've just locked the file, but it might * ref value.
* have changed the moment *before* we locked it. *
* This could happen with a very small chance when
* `update-ref -d` is called and at the same time another
* `pack-refs --all` process is running.
*
* Now that we hold the `packed-refs` lock, it is important
* to make sure we could read the latest version of
* `packed-refs` file no matter we have just mmap it or not.
* So what need to do is clear the snapshot if we hold it
* already.
*/ */
validate_snapshot(refs); clear_snapshot(refs);
/* /*
* Now make sure that the packed-refs file as it exists in the * Now make sure that the packed-refs file as it exists in the