Skip to content

Commit 08efe69

Browse files
pks-tgitster
authored andcommitted
reftable/stack: provide convenience functions to create iterators
There exist a bunch of call sites in the reftable backend that want to create iterators for a reftable stack. This is rather convoluted right now, where you always have to go via the merged table. And it is about to become even more convoluted when we split up iterator initialization and seeking in the next commit. Introduce convenience functions that allow the caller to create an iterator from a reftable stack directly without going through the merged table. Adapt callers accordingly. Signed-off-by: Patrick Steinhardt <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 0e7be2b commit 08efe69

File tree

5 files changed

+63
-30
lines changed

5 files changed

+63
-30
lines changed

refs/reftable-backend.c

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
#include "../reftable/reftable-record.h"
1616
#include "../reftable/reftable-error.h"
1717
#include "../reftable/reftable-iterator.h"
18-
#include "../reftable/reftable-merged.h"
1918
#include "../setup.h"
2019
#include "../strmap.h"
2120
#include "parse.h"
@@ -462,7 +461,6 @@ static struct reftable_ref_iterator *ref_iterator_for_stack(struct reftable_ref_
462461
const char *prefix,
463462
int flags)
464463
{
465-
struct reftable_merged_table *merged_table;
466464
struct reftable_ref_iterator *iter;
467465
int ret;
468466

@@ -482,9 +480,8 @@ static struct reftable_ref_iterator *ref_iterator_for_stack(struct reftable_ref_
482480
if (ret)
483481
goto done;
484482

485-
merged_table = reftable_stack_merged_table(stack);
486-
487-
ret = reftable_merged_table_seek_ref(merged_table, &iter->iter, prefix);
483+
reftable_stack_init_ref_iterator(stack, &iter->iter);
484+
ret = reftable_iterator_seek_ref(&iter->iter, prefix);
488485
if (ret)
489486
goto done;
490487

@@ -1015,8 +1012,6 @@ static int transaction_update_cmp(const void *a, const void *b)
10151012
static int write_transaction_table(struct reftable_writer *writer, void *cb_data)
10161013
{
10171014
struct write_transaction_table_arg *arg = cb_data;
1018-
struct reftable_merged_table *mt =
1019-
reftable_stack_merged_table(arg->stack);
10201015
uint64_t ts = reftable_stack_next_update_index(arg->stack);
10211016
struct reftable_log_record *logs = NULL;
10221017
struct ident_split committer_ident = {0};
@@ -1051,6 +1046,8 @@ static int write_transaction_table(struct reftable_writer *writer, void *cb_data
10511046
struct reftable_log_record log = {0};
10521047
struct reftable_iterator it = {0};
10531048

1049+
reftable_stack_init_log_iterator(arg->stack, &it);
1050+
10541051
/*
10551052
* When deleting refs we also delete all reflog entries
10561053
* with them. While it is not strictly required to
@@ -1060,7 +1057,7 @@ static int write_transaction_table(struct reftable_writer *writer, void *cb_data
10601057
* Unfortunately, we have no better way than to delete
10611058
* all reflog entries one by one.
10621059
*/
1063-
ret = reftable_merged_table_seek_log(mt, &it, u->refname);
1060+
ret = reftable_iterator_seek_log(&it, u->refname);
10641061
while (ret == 0) {
10651062
struct reftable_log_record *tombstone;
10661063

@@ -1354,7 +1351,6 @@ static int write_copy_table(struct reftable_writer *writer, void *cb_data)
13541351
{
13551352
struct write_copy_arg *arg = cb_data;
13561353
uint64_t deletion_ts, creation_ts;
1357-
struct reftable_merged_table *mt = reftable_stack_merged_table(arg->stack);
13581354
struct reftable_ref_record old_ref = {0}, refs[2] = {0};
13591355
struct reftable_log_record old_log = {0}, *logs = NULL;
13601356
struct reftable_iterator it = {0};
@@ -1488,7 +1484,8 @@ static int write_copy_table(struct reftable_writer *writer, void *cb_data)
14881484
* copy over all log entries from the old reflog. Last but not least,
14891485
* when renaming we also have to delete all the old reflog entries.
14901486
*/
1491-
ret = reftable_merged_table_seek_log(mt, &it, arg->oldname);
1487+
reftable_stack_init_log_iterator(arg->stack, &it);
1488+
ret = reftable_iterator_seek_log(&it, arg->oldname);
14921489
if (ret < 0)
14931490
goto done;
14941491

@@ -1694,7 +1691,6 @@ static struct ref_iterator_vtable reftable_reflog_iterator_vtable = {
16941691
static struct reftable_reflog_iterator *reflog_iterator_for_stack(struct reftable_ref_store *refs,
16951692
struct reftable_stack *stack)
16961693
{
1697-
struct reftable_merged_table *merged_table;
16981694
struct reftable_reflog_iterator *iter;
16991695
int ret;
17001696

@@ -1711,9 +1707,8 @@ static struct reftable_reflog_iterator *reflog_iterator_for_stack(struct reftabl
17111707
if (ret < 0)
17121708
goto done;
17131709

1714-
merged_table = reftable_stack_merged_table(stack);
1715-
1716-
ret = reftable_merged_table_seek_log(merged_table, &iter->iter, "");
1710+
reftable_stack_init_log_iterator(stack, &iter->iter);
1711+
ret = reftable_iterator_seek_log(&iter->iter, "");
17171712
if (ret < 0)
17181713
goto done;
17191714

@@ -1771,16 +1766,15 @@ static int reftable_be_for_each_reflog_ent_reverse(struct ref_store *ref_store,
17711766
struct reftable_ref_store *refs =
17721767
reftable_be_downcast(ref_store, REF_STORE_READ, "for_each_reflog_ent_reverse");
17731768
struct reftable_stack *stack = stack_for(refs, refname, &refname);
1774-
struct reftable_merged_table *mt = NULL;
17751769
struct reftable_log_record log = {0};
17761770
struct reftable_iterator it = {0};
17771771
int ret;
17781772

17791773
if (refs->err < 0)
17801774
return refs->err;
17811775

1782-
mt = reftable_stack_merged_table(stack);
1783-
ret = reftable_merged_table_seek_log(mt, &it, refname);
1776+
reftable_stack_init_log_iterator(stack, &it);
1777+
ret = reftable_iterator_seek_log(&it, refname);
17841778
while (!ret) {
17851779
ret = reftable_iterator_next_log(&it, &log);
17861780
if (ret < 0)
@@ -1808,7 +1802,6 @@ static int reftable_be_for_each_reflog_ent(struct ref_store *ref_store,
18081802
struct reftable_ref_store *refs =
18091803
reftable_be_downcast(ref_store, REF_STORE_READ, "for_each_reflog_ent");
18101804
struct reftable_stack *stack = stack_for(refs, refname, &refname);
1811-
struct reftable_merged_table *mt = NULL;
18121805
struct reftable_log_record *logs = NULL;
18131806
struct reftable_iterator it = {0};
18141807
size_t logs_alloc = 0, logs_nr = 0, i;
@@ -1817,8 +1810,8 @@ static int reftable_be_for_each_reflog_ent(struct ref_store *ref_store,
18171810
if (refs->err < 0)
18181811
return refs->err;
18191812

1820-
mt = reftable_stack_merged_table(stack);
1821-
ret = reftable_merged_table_seek_log(mt, &it, refname);
1813+
reftable_stack_init_log_iterator(stack, &it);
1814+
ret = reftable_iterator_seek_log(&it, refname);
18221815
while (!ret) {
18231816
struct reftable_log_record log = {0};
18241817

@@ -1855,7 +1848,6 @@ static int reftable_be_reflog_exists(struct ref_store *ref_store,
18551848
struct reftable_ref_store *refs =
18561849
reftable_be_downcast(ref_store, REF_STORE_READ, "reflog_exists");
18571850
struct reftable_stack *stack = stack_for(refs, refname, &refname);
1858-
struct reftable_merged_table *mt = reftable_stack_merged_table(stack);
18591851
struct reftable_log_record log = {0};
18601852
struct reftable_iterator it = {0};
18611853
int ret;
@@ -1868,7 +1860,8 @@ static int reftable_be_reflog_exists(struct ref_store *ref_store,
18681860
if (ret < 0)
18691861
goto done;
18701862

1871-
ret = reftable_merged_table_seek_log(mt, &it, refname);
1863+
reftable_stack_init_log_iterator(stack, &it);
1864+
ret = reftable_iterator_seek_log(&it, refname);
18721865
if (ret < 0)
18731866
goto done;
18741867

@@ -1966,21 +1959,21 @@ struct write_reflog_delete_arg {
19661959
static int write_reflog_delete_table(struct reftable_writer *writer, void *cb_data)
19671960
{
19681961
struct write_reflog_delete_arg *arg = cb_data;
1969-
struct reftable_merged_table *mt =
1970-
reftable_stack_merged_table(arg->stack);
19711962
struct reftable_log_record log = {0}, tombstone = {0};
19721963
struct reftable_iterator it = {0};
19731964
uint64_t ts = reftable_stack_next_update_index(arg->stack);
19741965
int ret;
19751966

19761967
reftable_writer_set_limits(writer, ts, ts);
19771968

1969+
reftable_stack_init_log_iterator(arg->stack, &it);
1970+
19781971
/*
19791972
* In order to delete a table we need to delete all reflog entries one
19801973
* by one. This is inefficient, but the reftable format does not have a
19811974
* better marker right now.
19821975
*/
1983-
ret = reftable_merged_table_seek_log(mt, &it, arg->refname);
1976+
ret = reftable_iterator_seek_log(&it, arg->refname);
19841977
while (ret == 0) {
19851978
ret = reftable_iterator_next_log(&it, &log);
19861979
if (ret < 0)
@@ -2116,7 +2109,6 @@ static int reftable_be_reflog_expire(struct ref_store *ref_store,
21162109
struct reftable_ref_store *refs =
21172110
reftable_be_downcast(ref_store, REF_STORE_WRITE, "reflog_expire");
21182111
struct reftable_stack *stack = stack_for(refs, refname, &refname);
2119-
struct reftable_merged_table *mt = reftable_stack_merged_table(stack);
21202112
struct reftable_log_record *logs = NULL;
21212113
struct reftable_log_record *rewritten = NULL;
21222114
struct reftable_ref_record ref_record = {0};
@@ -2135,7 +2127,9 @@ static int reftable_be_reflog_expire(struct ref_store *ref_store,
21352127
if (ret < 0)
21362128
goto done;
21372129

2138-
ret = reftable_merged_table_seek_log(mt, &it, refname);
2130+
reftable_stack_init_log_iterator(stack, &it);
2131+
2132+
ret = reftable_iterator_seek_log(&it, refname);
21392133
if (ret < 0)
21402134
goto done;
21412135

reftable/merged.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -253,9 +253,9 @@ reftable_merged_table_min_update_index(struct reftable_merged_table *mt)
253253
return mt->min;
254254
}
255255

256-
static void merged_table_init_iter(struct reftable_merged_table *mt,
257-
struct reftable_iterator *it,
258-
uint8_t typ)
256+
void merged_table_init_iter(struct reftable_merged_table *mt,
257+
struct reftable_iterator *it,
258+
uint8_t typ)
259259
{
260260
struct merged_iter *mi = reftable_malloc(sizeof(*mi));
261261
merged_iter_init(mi, mt, typ);

reftable/merged.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,10 @@ struct reftable_merged_table {
2626

2727
void merged_table_release(struct reftable_merged_table *mt);
2828

29+
struct reftable_iterator;
30+
31+
void merged_table_init_iter(struct reftable_merged_table *mt,
32+
struct reftable_iterator *it,
33+
uint8_t typ);
34+
2935
#endif

reftable/reftable-stack.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,24 @@ int reftable_stack_add(struct reftable_stack *st,
6666
void *write_arg),
6767
void *write_arg);
6868

69+
struct reftable_iterator;
70+
71+
/*
72+
* Initialize an iterator for the merged tables contained in the stack that can
73+
* be used to iterate through refs. The iterator is valid until the next reload
74+
* or write.
75+
*/
76+
void reftable_stack_init_ref_iterator(struct reftable_stack *st,
77+
struct reftable_iterator *it);
78+
79+
/*
80+
* Initialize an iterator for the merged tables contained in the stack that can
81+
* be used to iterate through logs. The iterator is valid until the next reload
82+
* or write.
83+
*/
84+
void reftable_stack_init_log_iterator(struct reftable_stack *st,
85+
struct reftable_iterator *it);
86+
6987
/* returns the merged_table for seeking. This table is valid until the
7088
* next write or reload, and should not be closed or deleted.
7189
*/

reftable/stack.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ license that can be found in the LICENSE file or at
1010

1111
#include "../write-or-die.h"
1212
#include "system.h"
13+
#include "constants.h"
1314
#include "merged.h"
1415
#include "reader.h"
1516
#include "reftable-error.h"
@@ -130,6 +131,20 @@ int read_lines(const char *filename, char ***namesp)
130131
return err;
131132
}
132133

134+
void reftable_stack_init_ref_iterator(struct reftable_stack *st,
135+
struct reftable_iterator *it)
136+
{
137+
merged_table_init_iter(reftable_stack_merged_table(st),
138+
it, BLOCK_TYPE_REF);
139+
}
140+
141+
void reftable_stack_init_log_iterator(struct reftable_stack *st,
142+
struct reftable_iterator *it)
143+
{
144+
merged_table_init_iter(reftable_stack_merged_table(st),
145+
it, BLOCK_TYPE_LOG);
146+
}
147+
133148
struct reftable_merged_table *
134149
reftable_stack_merged_table(struct reftable_stack *st)
135150
{

0 commit comments

Comments
 (0)