Skip to content

Commit 1df18a1

Browse files
john-caigitster
authored andcommitted
reftable: honor core.fsync
While the reffiles backend honors configured fsync settings, the reftable backend does not. Address this by fsyncing reftable files using the write-or-die api's fsync_component() in two places: when we add additional entries into the table, and when we close the reftable writer. This commits adds a flush function pointer as a new member of reftable_writer because we are not sure that the first argument to the *write function pointer always contains a file descriptor. In the case of strbuf_add_void, the first argument is a buffer. This way, we can pass in a corresponding flush function that knows how to flush depending on which writer is being used. This patch does not contain tests as they will need to wait for another patch to start to exercise the reftable backend. At that point, the tests will be added to observe that fsyncs are happening when the reftable is in use. Signed-off-by: John Cai <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent e02ecfc commit 1df18a1

File tree

9 files changed

+46
-19
lines changed

9 files changed

+46
-19
lines changed

reftable/merged_test.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ static void write_test_table(struct strbuf *buf,
4242
}
4343
}
4444

45-
w = reftable_new_writer(&strbuf_add_void, buf, &opts);
45+
w = reftable_new_writer(&strbuf_add_void, &noop_flush, buf, &opts);
4646
reftable_writer_set_limits(w, min, max);
4747

4848
for (i = 0; i < n; i++) {
@@ -70,7 +70,7 @@ static void write_test_log_table(struct strbuf *buf,
7070
.exact_log_message = 1,
7171
};
7272
struct reftable_writer *w = NULL;
73-
w = reftable_new_writer(&strbuf_add_void, buf, &opts);
73+
w = reftable_new_writer(&strbuf_add_void, &noop_flush, buf, &opts);
7474
reftable_writer_set_limits(w, update_index, update_index);
7575

7676
for (i = 0; i < n; i++) {
@@ -412,7 +412,7 @@ static void test_default_write_opts(void)
412412
struct reftable_write_options opts = { 0 };
413413
struct strbuf buf = STRBUF_INIT;
414414
struct reftable_writer *w =
415-
reftable_new_writer(&strbuf_add_void, &buf, &opts);
415+
reftable_new_writer(&strbuf_add_void, &noop_flush, &buf, &opts);
416416

417417
struct reftable_ref_record rec = {
418418
.refname = "master",

reftable/readwrite_test.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ static void write_table(char ***names, struct strbuf *buf, int N,
5151
.hash_id = hash_id,
5252
};
5353
struct reftable_writer *w =
54-
reftable_new_writer(&strbuf_add_void, buf, &opts);
54+
reftable_new_writer(&strbuf_add_void, &noop_flush, buf, &opts);
5555
struct reftable_ref_record ref = { NULL };
5656
int i = 0, n;
5757
struct reftable_log_record log = { NULL };
@@ -130,7 +130,7 @@ static void test_log_buffer_size(void)
130130
.message = "commit: 9\n",
131131
} } };
132132
struct reftable_writer *w =
133-
reftable_new_writer(&strbuf_add_void, &buf, &opts);
133+
reftable_new_writer(&strbuf_add_void, &noop_flush, &buf, &opts);
134134

135135
/* This tests buffer extension for log compression. Must use a random
136136
hash, to ensure that the compressed part is larger than the original.
@@ -171,7 +171,7 @@ static void test_log_overflow(void)
171171
.message = msg,
172172
} } };
173173
struct reftable_writer *w =
174-
reftable_new_writer(&strbuf_add_void, &buf, &opts);
174+
reftable_new_writer(&strbuf_add_void, &noop_flush, &buf, &opts);
175175

176176
uint8_t hash1[GIT_SHA1_RAWSZ] = {1}, hash2[GIT_SHA1_RAWSZ] = { 2 };
177177

@@ -202,7 +202,7 @@ static void test_log_write_read(void)
202202
struct reftable_block_source source = { NULL };
203203
struct strbuf buf = STRBUF_INIT;
204204
struct reftable_writer *w =
205-
reftable_new_writer(&strbuf_add_void, &buf, &opts);
205+
reftable_new_writer(&strbuf_add_void, &noop_flush, &buf, &opts);
206206
const struct reftable_stats *stats = NULL;
207207
reftable_writer_set_limits(w, 0, N);
208208
for (i = 0; i < N; i++) {
@@ -294,7 +294,7 @@ static void test_log_zlib_corruption(void)
294294
struct reftable_block_source source = { 0 };
295295
struct strbuf buf = STRBUF_INIT;
296296
struct reftable_writer *w =
297-
reftable_new_writer(&strbuf_add_void, &buf, &opts);
297+
reftable_new_writer(&strbuf_add_void, &noop_flush, &buf, &opts);
298298
const struct reftable_stats *stats = NULL;
299299
uint8_t hash1[GIT_SHA1_RAWSZ] = { 1 };
300300
uint8_t hash2[GIT_SHA1_RAWSZ] = { 2 };
@@ -535,7 +535,7 @@ static void test_table_refs_for(int indexed)
535535

536536
struct strbuf buf = STRBUF_INIT;
537537
struct reftable_writer *w =
538-
reftable_new_writer(&strbuf_add_void, &buf, &opts);
538+
reftable_new_writer(&strbuf_add_void, &noop_flush, &buf, &opts);
539539

540540
struct reftable_iterator it = { NULL };
541541
int j;
@@ -628,7 +628,7 @@ static void test_write_empty_table(void)
628628
struct reftable_write_options opts = { 0 };
629629
struct strbuf buf = STRBUF_INIT;
630630
struct reftable_writer *w =
631-
reftable_new_writer(&strbuf_add_void, &buf, &opts);
631+
reftable_new_writer(&strbuf_add_void, &noop_flush, &buf, &opts);
632632
struct reftable_block_source source = { NULL };
633633
struct reftable_reader *rd = NULL;
634634
struct reftable_ref_record rec = { NULL };
@@ -666,7 +666,7 @@ static void test_write_object_id_min_length(void)
666666
};
667667
struct strbuf buf = STRBUF_INIT;
668668
struct reftable_writer *w =
669-
reftable_new_writer(&strbuf_add_void, &buf, &opts);
669+
reftable_new_writer(&strbuf_add_void, &noop_flush, &buf, &opts);
670670
struct reftable_ref_record ref = {
671671
.update_index = 1,
672672
.value_type = REFTABLE_REF_VAL1,
@@ -701,7 +701,7 @@ static void test_write_object_id_length(void)
701701
};
702702
struct strbuf buf = STRBUF_INIT;
703703
struct reftable_writer *w =
704-
reftable_new_writer(&strbuf_add_void, &buf, &opts);
704+
reftable_new_writer(&strbuf_add_void, &noop_flush, &buf, &opts);
705705
struct reftable_ref_record ref = {
706706
.update_index = 1,
707707
.value_type = REFTABLE_REF_VAL1,
@@ -735,7 +735,7 @@ static void test_write_empty_key(void)
735735
struct reftable_write_options opts = { 0 };
736736
struct strbuf buf = STRBUF_INIT;
737737
struct reftable_writer *w =
738-
reftable_new_writer(&strbuf_add_void, &buf, &opts);
738+
reftable_new_writer(&strbuf_add_void, &noop_flush, &buf, &opts);
739739
struct reftable_ref_record ref = {
740740
.refname = "",
741741
.update_index = 1,
@@ -758,7 +758,7 @@ static void test_write_key_order(void)
758758
struct reftable_write_options opts = { 0 };
759759
struct strbuf buf = STRBUF_INIT;
760760
struct reftable_writer *w =
761-
reftable_new_writer(&strbuf_add_void, &buf, &opts);
761+
reftable_new_writer(&strbuf_add_void, &noop_flush, &buf, &opts);
762762
struct reftable_ref_record refs[2] = {
763763
{
764764
.refname = "b",
@@ -801,7 +801,7 @@ static void test_write_multiple_indices(void)
801801
struct reftable_reader *reader;
802802
int err, i;
803803

804-
writer = reftable_new_writer(&strbuf_add_void, &writer_buf, &opts);
804+
writer = reftable_new_writer(&strbuf_add_void, &noop_flush, &writer_buf, &opts);
805805
reftable_writer_set_limits(writer, 1, 1);
806806
for (i = 0; i < 100; i++) {
807807
struct reftable_ref_record ref = {

reftable/refname_test.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ static void test_conflict(void)
3030
struct reftable_write_options opts = { 0 };
3131
struct strbuf buf = STRBUF_INIT;
3232
struct reftable_writer *w =
33-
reftable_new_writer(&strbuf_add_void, &buf, &opts);
33+
reftable_new_writer(&strbuf_add_void, &noop_flush, &buf, &opts);
3434
struct reftable_ref_record rec = {
3535
.refname = "a/b",
3636
.value_type = REFTABLE_REF_SYMREF,

reftable/reftable-writer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ struct reftable_stats {
8888
/* reftable_new_writer creates a new writer */
8989
struct reftable_writer *
9090
reftable_new_writer(ssize_t (*writer_func)(void *, const void *, size_t),
91+
int (*flush_func)(void *),
9192
void *writer_arg, struct reftable_write_options *opts);
9293

9394
/* Set the range of update indices for the records we will add. When writing a

reftable/stack.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ license that can be found in the LICENSE file or at
88

99
#include "stack.h"
1010

11+
#include "../write-or-die.h"
1112
#include "system.h"
1213
#include "merged.h"
1314
#include "reader.h"
@@ -16,7 +17,6 @@ license that can be found in the LICENSE file or at
1617
#include "reftable-record.h"
1718
#include "reftable-merged.h"
1819
#include "writer.h"
19-
2020
#include "tempfile.h"
2121

2222
static int stack_try_add(struct reftable_stack *st,
@@ -47,6 +47,13 @@ static ssize_t reftable_fd_write(void *arg, const void *data, size_t sz)
4747
return write_in_full(*fdp, data, sz);
4848
}
4949

50+
static int reftable_fd_flush(void *arg)
51+
{
52+
int *fdp = (int *)arg;
53+
54+
return fsync_component(FSYNC_COMPONENT_REFERENCE, *fdp);
55+
}
56+
5057
int reftable_new_stack(struct reftable_stack **dest, const char *dir,
5158
struct reftable_write_options config)
5259
{
@@ -545,6 +552,9 @@ int reftable_addition_commit(struct reftable_addition *add)
545552
goto done;
546553
}
547554

555+
fsync_component_or_die(FSYNC_COMPONENT_REFERENCE, lock_file_fd,
556+
get_tempfile_path(add->lock_file));
557+
548558
err = rename_tempfile(&add->lock_file, add->stack->list_file);
549559
if (err < 0) {
550560
err = REFTABLE_IO_ERROR;
@@ -639,7 +649,7 @@ int reftable_addition_add(struct reftable_addition *add,
639649
goto done;
640650
}
641651
}
642-
wr = reftable_new_writer(reftable_fd_write, &tab_fd,
652+
wr = reftable_new_writer(reftable_fd_write, reftable_fd_flush, &tab_fd,
643653
&add->stack->config);
644654
err = write_table(wr, arg);
645655
if (err < 0)
@@ -731,7 +741,7 @@ static int stack_compact_locked(struct reftable_stack *st, int first, int last,
731741
strbuf_addstr(temp_tab, ".temp.XXXXXX");
732742

733743
tab_fd = mkstemp(temp_tab->buf);
734-
wr = reftable_new_writer(reftable_fd_write, &tab_fd, &st->config);
744+
wr = reftable_new_writer(reftable_fd_write, reftable_fd_flush, &tab_fd, &st->config);
735745

736746
err = stack_write_compact(st, wr, first, last, config);
737747
if (err < 0)

reftable/test_framework.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,8 @@ ssize_t strbuf_add_void(void *b, const void *data, size_t sz)
2020
strbuf_add(b, data, sz);
2121
return sz;
2222
}
23+
24+
int noop_flush(void *arg)
25+
{
26+
return 0;
27+
}

reftable/test_framework.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,6 @@ void set_test_hash(uint8_t *p, int i);
5656
*/
5757
ssize_t strbuf_add_void(void *b, const void *data, size_t sz);
5858

59+
int noop_flush(void *);
60+
5961
#endif

reftable/writer.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ static struct strbuf reftable_empty_strbuf = STRBUF_INIT;
121121

122122
struct reftable_writer *
123123
reftable_new_writer(ssize_t (*writer_func)(void *, const void *, size_t),
124+
int (*flush_func)(void *),
124125
void *writer_arg, struct reftable_write_options *opts)
125126
{
126127
struct reftable_writer *wp =
@@ -136,6 +137,7 @@ reftable_new_writer(ssize_t (*writer_func)(void *, const void *, size_t),
136137
wp->write = writer_func;
137138
wp->write_arg = writer_arg;
138139
wp->opts = *opts;
140+
wp->flush = flush_func;
139141
writer_reinit_block_writer(wp, BLOCK_TYPE_REF);
140142

141143
return wp;
@@ -603,6 +605,12 @@ int reftable_writer_close(struct reftable_writer *w)
603605
put_be32(p, crc32(0, footer, p - footer));
604606
p += 4;
605607

608+
err = w->flush(w->write_arg);
609+
if (err < 0) {
610+
err = REFTABLE_IO_ERROR;
611+
goto done;
612+
}
613+
606614
err = padded_write(w, footer, footer_size(writer_version(w)), 0);
607615
if (err < 0)
608616
goto done;

reftable/writer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ license that can be found in the LICENSE file or at
1616

1717
struct reftable_writer {
1818
ssize_t (*write)(void *, const void *, size_t);
19+
int (*flush)(void *);
1920
void *write_arg;
2021
int pending_padding;
2122
struct strbuf last_key;

0 commit comments

Comments
 (0)