Prevent git from rehashing 4GiB files
commit5143ac07b17e2b025865378fce24cc11ac7bf8b1
authorJason Hatton <jhatton@globalfinishing.com>
Thu, 12 Oct 2023 16:09:30 +0000 (12 16:09 +0000)
committerJunio C Hamano <gitster@pobox.com>
Fri, 13 Oct 2023 20:33:35 +0000 (13 13:33 -0700)
tree5a09d65e4fa14273e763d0ec8994a0fe01a1eb09
parent678eb55f5da174fce21f686f0073d56904c081c9
Prevent git from rehashing 4GiB files

The index stores file sizes using a uint32_t. This causes any file
that is a multiple of 2^32 to have a cached file size of zero.
Zero is a special value used by racily clean. This causes git to
rehash every file that is a multiple of 2^32 every time git status
or git commit is run.

This patch mitigates the problem by making all files that are a
multiple of 2^32 appear to have a size of 1<<31 instead of zero.

The value of 1<<31 is chosen to keep it as far away from zero
as possible to help prevent things getting mixed up with unpatched
versions of git.

An example would be to have a 2^32 sized file in the index of
patched git. Patched git would save the file as 2^31 in the cache.
An unpatched git would very much see the file has changed in size
and force it to rehash the file, which is safe. The file would
have to grow or shrink by exactly 2^31 and retain all of its
ctime, mtime, and other attributes for old git to not notice
the change.

This patch does not change the behavior of any file that is not
an exact multiple of 2^32.

Signed-off-by: Jason D. Hatton <jhatton@globalfinishing.com>
Signed-off-by: brian m. carlson <bk2204@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
statinfo.c
t/t7508-status.sh