Merge branch 'ps/fsync-refs'
Updates to refs traditionally weren't fsync'ed, but we can configure using core.fsync variable to do so. * ps/fsync-refs: core.fsync: new option to harden references
This commit is contained in:
@ -575,6 +575,7 @@ but risks losing recent work in the event of an unclean system shutdown.
|
|||||||
* `index` hardens the index when it is modified.
|
* `index` hardens the index when it is modified.
|
||||||
* `objects` is an aggregate option that is equivalent to
|
* `objects` is an aggregate option that is equivalent to
|
||||||
`loose-object,pack`.
|
`loose-object,pack`.
|
||||||
|
* `reference` hardens references modified in the repo.
|
||||||
* `derived-metadata` is an aggregate option that is equivalent to
|
* `derived-metadata` is an aggregate option that is equivalent to
|
||||||
`pack-metadata,commit-graph`.
|
`pack-metadata,commit-graph`.
|
||||||
* `committed` is an aggregate option that is currently equivalent to
|
* `committed` is an aggregate option that is currently equivalent to
|
||||||
|
7
cache.h
7
cache.h
@ -1005,6 +1005,7 @@ enum fsync_component {
|
|||||||
FSYNC_COMPONENT_PACK_METADATA = 1 << 2,
|
FSYNC_COMPONENT_PACK_METADATA = 1 << 2,
|
||||||
FSYNC_COMPONENT_COMMIT_GRAPH = 1 << 3,
|
FSYNC_COMPONENT_COMMIT_GRAPH = 1 << 3,
|
||||||
FSYNC_COMPONENT_INDEX = 1 << 4,
|
FSYNC_COMPONENT_INDEX = 1 << 4,
|
||||||
|
FSYNC_COMPONENT_REFERENCE = 1 << 5,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define FSYNC_COMPONENTS_OBJECTS (FSYNC_COMPONENT_LOOSE_OBJECT | \
|
#define FSYNC_COMPONENTS_OBJECTS (FSYNC_COMPONENT_LOOSE_OBJECT | \
|
||||||
@ -1017,7 +1018,8 @@ enum fsync_component {
|
|||||||
FSYNC_COMPONENTS_DERIVED_METADATA | \
|
FSYNC_COMPONENTS_DERIVED_METADATA | \
|
||||||
~FSYNC_COMPONENT_LOOSE_OBJECT)
|
~FSYNC_COMPONENT_LOOSE_OBJECT)
|
||||||
|
|
||||||
#define FSYNC_COMPONENTS_COMMITTED (FSYNC_COMPONENTS_OBJECTS)
|
#define FSYNC_COMPONENTS_COMMITTED (FSYNC_COMPONENTS_OBJECTS | \
|
||||||
|
FSYNC_COMPONENT_REFERENCE)
|
||||||
|
|
||||||
#define FSYNC_COMPONENTS_ADDED (FSYNC_COMPONENTS_COMMITTED | \
|
#define FSYNC_COMPONENTS_ADDED (FSYNC_COMPONENTS_COMMITTED | \
|
||||||
FSYNC_COMPONENT_INDEX)
|
FSYNC_COMPONENT_INDEX)
|
||||||
@ -1026,7 +1028,8 @@ enum fsync_component {
|
|||||||
FSYNC_COMPONENT_PACK | \
|
FSYNC_COMPONENT_PACK | \
|
||||||
FSYNC_COMPONENT_PACK_METADATA | \
|
FSYNC_COMPONENT_PACK_METADATA | \
|
||||||
FSYNC_COMPONENT_COMMIT_GRAPH | \
|
FSYNC_COMPONENT_COMMIT_GRAPH | \
|
||||||
FSYNC_COMPONENT_INDEX)
|
FSYNC_COMPONENT_INDEX | \
|
||||||
|
FSYNC_COMPONENT_REFERENCE)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A bitmask indicating which components of the repo should be fsynced.
|
* A bitmask indicating which components of the repo should be fsynced.
|
||||||
|
1
config.c
1
config.c
@ -1333,6 +1333,7 @@ static const struct fsync_component_name {
|
|||||||
{ "commit-graph", FSYNC_COMPONENT_COMMIT_GRAPH },
|
{ "commit-graph", FSYNC_COMPONENT_COMMIT_GRAPH },
|
||||||
{ "index", FSYNC_COMPONENT_INDEX },
|
{ "index", FSYNC_COMPONENT_INDEX },
|
||||||
{ "objects", FSYNC_COMPONENTS_OBJECTS },
|
{ "objects", FSYNC_COMPONENTS_OBJECTS },
|
||||||
|
{ "reference", FSYNC_COMPONENT_REFERENCE },
|
||||||
{ "derived-metadata", FSYNC_COMPONENTS_DERIVED_METADATA },
|
{ "derived-metadata", FSYNC_COMPONENTS_DERIVED_METADATA },
|
||||||
{ "committed", FSYNC_COMPONENTS_COMMITTED },
|
{ "committed", FSYNC_COMPONENTS_COMMITTED },
|
||||||
{ "added", FSYNC_COMPONENTS_ADDED },
|
{ "added", FSYNC_COMPONENTS_ADDED },
|
||||||
|
@ -1809,6 +1809,7 @@ static int write_ref_to_lockfile(struct ref_lock *lock,
|
|||||||
fd = get_lock_file_fd(&lock->lk);
|
fd = get_lock_file_fd(&lock->lk);
|
||||||
if (write_in_full(fd, oid_to_hex(oid), the_hash_algo->hexsz) < 0 ||
|
if (write_in_full(fd, oid_to_hex(oid), the_hash_algo->hexsz) < 0 ||
|
||||||
write_in_full(fd, &term, 1) < 0 ||
|
write_in_full(fd, &term, 1) < 0 ||
|
||||||
|
fsync_component(FSYNC_COMPONENT_REFERENCE, get_lock_file_fd(&lock->lk)) < 0 ||
|
||||||
close_ref_gently(lock) < 0) {
|
close_ref_gently(lock) < 0) {
|
||||||
strbuf_addf(err,
|
strbuf_addf(err,
|
||||||
"couldn't write '%s'", get_lock_file_path(&lock->lk));
|
"couldn't write '%s'", get_lock_file_path(&lock->lk));
|
||||||
|
@ -1262,7 +1262,8 @@ static int write_with_updates(struct packed_ref_store *refs,
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (close_tempfile_gently(refs->tempfile)) {
|
if (fsync_component(FSYNC_COMPONENT_REFERENCE, get_tempfile_fd(refs->tempfile)) ||
|
||||||
|
close_tempfile_gently(refs->tempfile)) {
|
||||||
strbuf_addf(err, "error closing file %s: %s",
|
strbuf_addf(err, "error closing file %s: %s",
|
||||||
get_tempfile_path(refs->tempfile),
|
get_tempfile_path(refs->tempfile),
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
|
Reference in New Issue
Block a user