Skip to content

Commit b6fdf9a

Browse files
committed
Merge branch 'jc/reftable-core-fsync'
The write codepath for the reftable data learned to honor core.fsync configuration. * jc/reftable-core-fsync: reftable/stack: fsync "tables.list" during compaction reftable: honor core.fsync
2 parents 2a540e4 + 7fa52fd commit b6fdf9a

File tree

9 files changed

+54
-19
lines changed

9 files changed

+54
-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: 21 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
{
@@ -653,6 +660,9 @@ int reftable_addition_commit(struct reftable_addition *add)
653660
goto done;
654661
}
655662

663+
fsync_component_or_die(FSYNC_COMPONENT_REFERENCE, lock_file_fd,
664+
get_tempfile_path(add->lock_file));
665+
656666
err = rename_tempfile(&add->lock_file, add->stack->list_file);
657667
if (err < 0) {
658668
err = REFTABLE_IO_ERROR;
@@ -747,7 +757,7 @@ int reftable_addition_add(struct reftable_addition *add,
747757
goto done;
748758
}
749759
}
750-
wr = reftable_new_writer(reftable_fd_write, &tab_fd,
760+
wr = reftable_new_writer(reftable_fd_write, reftable_fd_flush, &tab_fd,
751761
&add->stack->config);
752762
err = write_table(wr, arg);
753763
if (err < 0)
@@ -839,7 +849,7 @@ static int stack_compact_locked(struct reftable_stack *st, int first, int last,
839849
strbuf_addstr(temp_tab, ".temp.XXXXXX");
840850

841851
tab_fd = mkstemp(temp_tab->buf);
842-
wr = reftable_new_writer(reftable_fd_write, &tab_fd, &st->config);
852+
wr = reftable_new_writer(reftable_fd_write, reftable_fd_flush, &tab_fd, &st->config);
843853

844854
err = stack_write_compact(st, wr, first, last, config);
845855
if (err < 0)
@@ -1116,6 +1126,14 @@ static int stack_compact_range(struct reftable_stack *st, int first, int last,
11161126
unlink(new_table_path.buf);
11171127
goto done;
11181128
}
1129+
1130+
err = fsync_component(FSYNC_COMPONENT_REFERENCE, lock_file_fd);
1131+
if (err < 0) {
1132+
err = REFTABLE_IO_ERROR;
1133+
unlink(new_table_path.buf);
1134+
goto done;
1135+
}
1136+
11191137
err = close(lock_file_fd);
11201138
lock_file_fd = -1;
11211139
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)