diff options
author | 2019-08-22 12:34:10 -0700 | |
---|---|---|
committer | 2019-08-22 12:34:10 -0700 | |
commit | 207ad3cb203b7adeeb52b5372ace497e20739d49 (patch) | |
tree | e98f896ff4dcd71615cbf483f22ee1f42ffb715a /refs | |
parent | Merge branch 'sg/do-not-skip-non-httpd-tests' (diff) | |
parent | pack-refs: always refresh after taking the lock file (diff) | |
download | tgif-207ad3cb203b7adeeb52b5372ace497e20739d49.tar.xz |
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
Diffstat (limited to 'refs')
-rw-r--r-- | refs/packed-backend.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/refs/packed-backend.c b/refs/packed-backend.c index c01c7f5901..4458a0f69c 100644 --- a/refs/packed-backend.c +++ b/refs/packed-backend.c @@ -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 - * snapshot matches the current version of the file. Normally - * `get_snapshot()` does that for us, but that function - * assumes that when the file is locked, any existing snapshot - * is still valid. We've just locked the file, but it might - * have changed the moment *before* we locked it. + * There is a stat-validity problem might cause `update-ref -d` + * lost the newly commit of a ref, because a new `packed-refs` + * file might has the same on-disk file attributes such as + * timestamp, file size and inode value, but has a changed + * ref value. + * + * 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 |