aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2024-08-23 16:12:54 +0200
committerJunio C Hamano <gitster@pobox.com>2024-08-23 08:04:47 -0700
commit1302ed68d4f5452242d47ac609b06b793a18ea0b (patch)
tree2b24d3408ec04351c21ddd22cae0693d3ef1ad0f
parent89eada4ea1f7a9c0a5f9b9e29592daa0847a79fc (diff)
downloadgit-1302ed68d4f5452242d47ac609b06b793a18ea0b.tar.gz
reftable/stack: reorder swapping in the reloaded stack contents
The code flow of how we swap in the reloaded stack contents is somewhat convoluted because we switch back and forth between swapping in different parts of the stack. Reorder the code to simplify it. We now first close and unlink the old tables which do not get reused before we update the stack to point to the new stack. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--reftable/stack.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/reftable/stack.c b/reftable/stack.c
index 8e85f8b4d9..0247222258 100644
--- a/reftable/stack.c
+++ b/reftable/stack.c
@@ -273,30 +273,34 @@ static int reftable_stack_reload_once(struct reftable_stack *st,
if (err < 0)
goto done;
- st->readers_len = new_readers_len;
- if (st->merged)
- reftable_merged_table_free(st->merged);
- if (st->readers) {
- reftable_free(st->readers);
- }
- st->readers = new_readers;
- new_readers = NULL;
- new_readers_len = 0;
-
- new_merged->suppress_deletions = 1;
- st->merged = new_merged;
+ /*
+ * Close the old, non-reused readers and proactively try to unlink
+ * them. This is done for systems like Windows, where the underlying
+ * file of such an open reader wouldn't have been possible to be
+ * unlinked by the compacting process.
+ */
for (i = 0; i < cur_len; i++) {
if (cur[i]) {
const char *name = reader_name(cur[i]);
stack_filename(&table_path, st, name);
-
reftable_reader_decref(cur[i]);
-
- /* On Windows, can only unlink after closing. */
unlink(table_path.buf);
}
}
+ /* Update the stack to point to the new tables. */
+ if (st->merged)
+ reftable_merged_table_free(st->merged);
+ new_merged->suppress_deletions = 1;
+ st->merged = new_merged;
+
+ if (st->readers)
+ reftable_free(st->readers);
+ st->readers = new_readers;
+ st->readers_len = new_readers_len;
+ new_readers = NULL;
+ new_readers_len = 0;
+
done:
for (i = 0; i < new_readers_len; i++)
reftable_reader_decref(new_readers[i]);