summaryrefslogtreecommitdiff
path: root/pack-write.c
diff options
context:
space:
mode:
authorTaylor Blau <me@ttaylorr.com>2021-09-09 19:24:41 -0400
committerJunio C Hamano <gitster@pobox.com>2021-09-09 18:23:11 -0700
commit16a86907bca0ae7ed9f1dfaa6261234215151396 (patch)
treee0eaf602b27115116333dc4c03751867945920cb /pack-write.c
parent66833f0e70c473ca6c4e6a79d34e879d8b40ba9d (diff)
downloadgit-16a86907bca0ae7ed9f1dfaa6261234215151396.tar.gz
pack-write.c: rename `.idx` files after `*.rev`
We treat the presence of an `.idx` file as the indicator of whether or not it's safe to use a packfile. But `finish_tmp_packfile()` (which is responsible for writing the pack and moving the temporary versions of all of its auxiliary files into place) is inconsistent about the write order. Specifically, it moves the `.rev` file into place after the `.idx`, leaving open the possibility to open a pack which looks "ready" (because the `.idx` file exists and is readable) but appears momentarily to not have a `.rev` file. This causes Git to fall back to generating the pack's reverse index in memory. Though racy, this amounts to an unnecessary slow-down at worst, and doesn't affect the correctness of the resulting reverse index. Close this race by moving the .rev file into place before moving the .idx file into place. This still leaves the issue of `.idx` files being renamed into place before the auxiliary `.bitmap` file is renamed when in pack-object.c's write_pack_file() "write_bitmap_index" is true. That race will be addressed in subsequent commits. Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Taylor Blau <me@ttaylorr.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'pack-write.c')
-rw-r--r--pack-write.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/pack-write.c b/pack-write.c
index ca94e2b106..51157916f5 100644
--- a/pack-write.c
+++ b/pack-write.c
@@ -495,9 +495,9 @@ void finish_tmp_packfile(struct strbuf *name_buffer,
pack_idx_opts->flags);
rename_tmp_packfile(name_buffer, pack_tmp_name, "pack");
- rename_tmp_packfile(name_buffer, idx_tmp_name, "idx");
if (rev_tmp_name)
rename_tmp_packfile(name_buffer, rev_tmp_name, "rev");
+ rename_tmp_packfile(name_buffer, idx_tmp_name, "idx");
free((void *)idx_tmp_name);
}