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 <johncai86@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
@ -8,6 +8,7 @@ https://developers.google.com/open-source/licenses/bsd
|
||||
|
||||
#include "stack.h"
|
||||
|
||||
#include "../write-or-die.h"
|
||||
#include "system.h"
|
||||
#include "merged.h"
|
||||
#include "reader.h"
|
||||
@ -16,7 +17,6 @@ https://developers.google.com/open-source/licenses/bsd
|
||||
#include "reftable-record.h"
|
||||
#include "reftable-merged.h"
|
||||
#include "writer.h"
|
||||
|
||||
#include "tempfile.h"
|
||||
|
||||
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)
|
||||
return write_in_full(*fdp, data, sz);
|
||||
}
|
||||
|
||||
static int reftable_fd_flush(void *arg)
|
||||
{
|
||||
int *fdp = (int *)arg;
|
||||
|
||||
return fsync_component(FSYNC_COMPONENT_REFERENCE, *fdp);
|
||||
}
|
||||
|
||||
int reftable_new_stack(struct reftable_stack **dest, const char *dir,
|
||||
struct reftable_write_options config)
|
||||
{
|
||||
@ -545,6 +552,9 @@ int reftable_addition_commit(struct reftable_addition *add)
|
||||
goto done;
|
||||
}
|
||||
|
||||
fsync_component_or_die(FSYNC_COMPONENT_REFERENCE, lock_file_fd,
|
||||
get_tempfile_path(add->lock_file));
|
||||
|
||||
err = rename_tempfile(&add->lock_file, add->stack->list_file);
|
||||
if (err < 0) {
|
||||
err = REFTABLE_IO_ERROR;
|
||||
@ -639,7 +649,7 @@ int reftable_addition_add(struct reftable_addition *add,
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
wr = reftable_new_writer(reftable_fd_write, &tab_fd,
|
||||
wr = reftable_new_writer(reftable_fd_write, reftable_fd_flush, &tab_fd,
|
||||
&add->stack->config);
|
||||
err = write_table(wr, arg);
|
||||
if (err < 0)
|
||||
@ -731,7 +741,7 @@ static int stack_compact_locked(struct reftable_stack *st, int first, int last,
|
||||
strbuf_addstr(temp_tab, ".temp.XXXXXX");
|
||||
|
||||
tab_fd = mkstemp(temp_tab->buf);
|
||||
wr = reftable_new_writer(reftable_fd_write, &tab_fd, &st->config);
|
||||
wr = reftable_new_writer(reftable_fd_write, reftable_fd_flush, &tab_fd, &st->config);
|
||||
|
||||
err = stack_write_compact(st, wr, first, last, config);
|
||||
if (err < 0)
|
||||
|
||||
Reference in New Issue
Block a user