mirror of
https://github.com/git-for-windows/git.git
synced 2026-04-09 15:01:59 -05:00
reftable/stack: provide fsync(3p) via system header
Users of the reftable library are expected to provide their own function callback in cases they want to sync(3p) data to disk via the reftable write options. But if no such function was provided we end up calling fsync(3p) directly, which may not even be available on some systems. While dropping the explicit call to fsync(3p) would work, it would lead to an unsafe default behaviour where a project may have forgotten to set up the callback function, and that could lead to potential data loss. So this is not a great solution. Instead, drop the callback function and make it mandatory for the project to define fsync(3p). In the case of Git, we can then easily inject our custom implementation via the "reftable-system.h" header so that we continue to use `fsync_component()`. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
34c17b840d
commit
b45ea595e6
@@ -366,11 +366,6 @@ static int reftable_be_config(const char *var, const char *value,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int reftable_be_fsync(int fd)
|
||||
{
|
||||
return fsync_component(FSYNC_COMPONENT_REFERENCE, fd);
|
||||
}
|
||||
|
||||
static struct ref_store *reftable_be_init(struct repository *repo,
|
||||
const char *payload,
|
||||
const char *gitdir,
|
||||
@@ -408,7 +403,6 @@ static struct ref_store *reftable_be_init(struct repository *repo,
|
||||
refs->write_options.disable_auto_compact =
|
||||
!git_env_bool("GIT_TEST_REFTABLE_AUTOCOMPACTION", 1);
|
||||
refs->write_options.lock_timeout_ms = 100;
|
||||
refs->write_options.fsync = reftable_be_fsync;
|
||||
|
||||
repo_config(the_repository, reftable_be_config, &refs->write_options);
|
||||
|
||||
|
||||
@@ -12,4 +12,7 @@
|
||||
#include "compat/posix.h"
|
||||
#include "compat/zlib-compat.h"
|
||||
|
||||
int reftable_fsync(int fd);
|
||||
#define fsync(fd) reftable_fsync(fd)
|
||||
|
||||
#endif
|
||||
|
||||
@@ -61,12 +61,6 @@ struct reftable_write_options {
|
||||
*/
|
||||
long lock_timeout_ms;
|
||||
|
||||
/*
|
||||
* Optional callback used to fsync files to disk. Falls back to using
|
||||
* fsync(3P) when unset.
|
||||
*/
|
||||
int (*fsync)(int fd);
|
||||
|
||||
/*
|
||||
* Callback function to execute whenever the stack is being reloaded.
|
||||
* This can be used e.g. to discard cached information that relies on
|
||||
|
||||
@@ -29,13 +29,6 @@ static int stack_filename(struct reftable_buf *dest, struct reftable_stack *st,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int stack_fsync(const struct reftable_write_options *opts, int fd)
|
||||
{
|
||||
if (opts->fsync)
|
||||
return opts->fsync(fd);
|
||||
return fsync(fd);
|
||||
}
|
||||
|
||||
static ssize_t reftable_write_data(int fd, const void *data, size_t size)
|
||||
{
|
||||
size_t total_written = 0;
|
||||
@@ -69,7 +62,7 @@ static ssize_t fd_writer_write(void *arg, const void *data, size_t sz)
|
||||
static int fd_writer_flush(void *arg)
|
||||
{
|
||||
struct fd_writer *writer = arg;
|
||||
return stack_fsync(writer->opts, writer->fd);
|
||||
return fsync(writer->fd);
|
||||
}
|
||||
|
||||
static int fd_read_lines(int fd, char ***namesp)
|
||||
@@ -812,7 +805,7 @@ int reftable_addition_commit(struct reftable_addition *add)
|
||||
goto done;
|
||||
}
|
||||
|
||||
err = stack_fsync(&add->stack->opts, add->tables_list_lock.fd);
|
||||
err = fsync(add->tables_list_lock.fd);
|
||||
if (err < 0) {
|
||||
err = REFTABLE_IO_ERROR;
|
||||
goto done;
|
||||
@@ -1480,7 +1473,7 @@ static int stack_compact_range(struct reftable_stack *st,
|
||||
goto done;
|
||||
}
|
||||
|
||||
err = stack_fsync(&st->opts, tables_list_lock.fd);
|
||||
err = fsync(tables_list_lock.fd);
|
||||
if (err < 0) {
|
||||
err = REFTABLE_IO_ERROR;
|
||||
unlink(new_table_path.buf);
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "reftable-error.h"
|
||||
#include "../lockfile.h"
|
||||
#include "../tempfile.h"
|
||||
#include "../write-or-die.h"
|
||||
|
||||
uint32_t reftable_rand(void)
|
||||
{
|
||||
@@ -131,3 +132,8 @@ int flock_commit(struct reftable_flock *l)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int reftable_fsync(int fd)
|
||||
{
|
||||
return fsync_component(FSYNC_COMPONENT_REFERENCE, fd);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user