reftable/stack: add mechanism to notify callers on reload
Reftable stacks are reloaded in two cases:
- When calling `reftable_stack_reload()`, if the stat-cache tells us
that the stack has been modified.
- When committing a reftable addition.
While callers can figure out the second case, they do not have a
mechanism to figure out whether `reftable_stack_reload()` led to an
actual reload of the on-disk data. All they can do is thus to assume
that data is always being reloaded in that case.
Improve the situation by introducing a new `on_reload()` callback to the
reftable options. If provided, the function will be invoked every time
the stack has indeed been reloaded. This allows callers to invalidate
data that depends on the current stack data.
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
96e7cb83b6
commit
eb22c1b46b
@@ -68,6 +68,15 @@ struct reftable_write_options {
|
|||||||
* fsync(3P) when unset.
|
* fsync(3P) when unset.
|
||||||
*/
|
*/
|
||||||
int (*fsync)(int fd);
|
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
|
||||||
|
* the old stack's data. The payload data will be passed as argument to
|
||||||
|
* the callback.
|
||||||
|
*/
|
||||||
|
void (*on_reload)(void *payload);
|
||||||
|
void *on_reload_payload;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* reftable_block_stats holds statistics for a single block type */
|
/* reftable_block_stats holds statistics for a single block type */
|
||||||
|
|||||||
@@ -548,6 +548,10 @@ out:
|
|||||||
close(fd);
|
close(fd);
|
||||||
free_names(names);
|
free_names(names);
|
||||||
free_names(names_after);
|
free_names(names_after);
|
||||||
|
|
||||||
|
if (st->opts.on_reload)
|
||||||
|
st->opts.on_reload(st->opts.on_reload_payload);
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user