reftable/merged: simplify indices for subiterators

When seeking on a merged table, we perform the seek for each of the subiterators. If the subiterator has the desired record we add it to the priority queue, otherwise we skip it and don't add it to the stack of subiterators hosted by the merged table. The consequence of this is that the index of the subiterator in the merged table does not necessarily correspond to the index of it in the merged iterator. Next to being potentially confusing, it also means that we won't easily be able to re-seek the merged iterator because we have no clear connection between both of the data structures. Refactor the code so that the index stays the same in both structures. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Patrick Steinhardt committed May 13, 2024 at 10:47 UTC 701713a254e7b8c955bc9a4a39a1eab17e1c457e
1 file changed +4 -5
reftable/merged.c
+4 -5
@@ -37,6 +37,7 @@ static void merged_iter_init(struct merged_iter *mi,
37 mi->advance_index = -1;
38 mi->suppress_deletions = mt->suppress_deletions;
39 REFTABLE_CALLOC_ARRAY(mi->subiters, mt->stack_len);
40 + mi->stack_len = mt->stack_len;
41 }
42
43 static void merged_iter_close(void *p)
@@ -236,21 +237,19 @@ static int merged_table_seek_record(struct reftable_merged_table *mt,
237 merged_iter_init(&merged, mt);
238
239 for (size_t i = 0; i < mt->stack_len; i++) {
239 - reftable_record_init(&merged.subiters[merged.stack_len].rec,
240 + reftable_record_init(&merged.subiters[i].rec,
241 reftable_record_type(rec));
242
243 err = reftable_table_seek_record(&mt->stack[i],
243 - &merged.subiters[merged.stack_len].iter, rec);
244 + &merged.subiters[i].iter, rec);
245 if (err < 0)
246 goto out;
247 if (err > 0)
248 continue;
249
249 - err = merged_iter_advance_subiter(&merged, merged.stack_len);
250 + err = merged_iter_advance_subiter(&merged, i);
251 if (err < 0)
252 goto out;
252 -
253 - merged.stack_len++;
253 }
254
255 p = reftable_malloc(sizeof(*p));