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>

Patrick Steinhardt committed Aug 23, 2024 at 16:12 UTC 1302ed68d4f5452242d47ac609b06b793a18ea0b
1 file changed +19 -15
reftable/stack.c
+19 -15
@@ -273,30 +273,34 @@ static int reftable_stack_reload_once(struct reftable_stack *st,
273 if (err < 0)
274 goto done;
275
276 - st->readers_len = new_readers_len;
277 - if (st->merged)
278 - reftable_merged_table_free(st->merged);
279 - if (st->readers) {
280 - reftable_free(st->readers);
281 - }
282 - st->readers = new_readers;
283 - new_readers = NULL;
284 - new_readers_len = 0;
285 -
286 - new_merged->suppress_deletions = 1;
287 - st->merged = new_merged;
276 + /*
277 + * Close the old, non-reused readers and proactively try to unlink
278 + * them. This is done for systems like Windows, where the underlying
279 + * file of such an open reader wouldn't have been possible to be
280 + * unlinked by the compacting process.
281 + */
282 for (i = 0; i < cur_len; i++) {
283 if (cur[i]) {
284 const char *name = reader_name(cur[i]);
285 stack_filename(&table_path, st, name);
292 -
286 reftable_reader_decref(cur[i]);
294 -
295 - /* On Windows, can only unlink after closing. */
287 unlink(table_path.buf);
288 }
289 }
290
291 + /* Update the stack to point to the new tables. */
292 + if (st->merged)
293 + reftable_merged_table_free(st->merged);
294 + new_merged->suppress_deletions = 1;
295 + st->merged = new_merged;
296 +
297 + if (st->readers)
298 + reftable_free(st->readers);
299 + st->readers = new_readers;
300 + st->readers_len = new_readers_len;
301 + new_readers = NULL;
302 + new_readers_len = 0;
303 +
304 done:
305 for (i = 0; i < new_readers_len; i++)
306 reftable_reader_decref(new_readers[i]);