2018-04-12 08:21:05 +08:00
|
|
|
#ifndef REPLACE_OBJECT_H
|
|
|
|
#define REPLACE_OBJECT_H
|
|
|
|
|
2018-04-12 08:21:06 +08:00
|
|
|
#include "oidmap.h"
|
|
|
|
#include "repository.h"
|
2023-05-16 14:34:06 +08:00
|
|
|
#include "object-store-ll.h"
|
2018-04-12 08:21:06 +08:00
|
|
|
|
2018-04-12 08:21:05 +08:00
|
|
|
struct replace_object {
|
|
|
|
struct oidmap_entry original;
|
|
|
|
struct object_id replacement;
|
|
|
|
};
|
|
|
|
|
2018-08-21 02:24:27 +08:00
|
|
|
void prepare_replace_object(struct repository *r);
|
|
|
|
|
2018-04-12 08:21:06 +08:00
|
|
|
/*
|
|
|
|
* This internal function is only declared here for the benefit of
|
|
|
|
* lookup_replace_object(). Please do not call it directly.
|
|
|
|
*/
|
2019-04-29 16:28:14 +08:00
|
|
|
const struct object_id *do_lookup_replace_object(struct repository *r,
|
2019-04-29 16:28:23 +08:00
|
|
|
const struct object_id *oid);
|
2018-04-12 08:21:06 +08:00
|
|
|
|
2023-06-06 21:24:36 +08:00
|
|
|
/*
|
|
|
|
* Some commands disable replace-refs unconditionally, and otherwise each
|
|
|
|
* repository could alter the core.useReplaceRefs config value.
|
|
|
|
*
|
|
|
|
* Return 1 if and only if all of the following are true:
|
|
|
|
*
|
|
|
|
* a. disable_replace_refs() has not been called.
|
|
|
|
* b. GIT_NO_REPLACE_OBJECTS is unset or zero.
|
|
|
|
* c. the given repository does not have core.useReplaceRefs=false.
|
|
|
|
*/
|
|
|
|
int replace_refs_enabled(struct repository *r);
|
|
|
|
|
2018-04-12 08:21:06 +08:00
|
|
|
/*
|
|
|
|
* If object sha1 should be replaced, return the replacement object's
|
|
|
|
* name (replaced recursively, if necessary). The return value is
|
|
|
|
* either sha1 or a pointer to a permanently-allocated value. When
|
|
|
|
* object replacement is suppressed, always return sha1.
|
replace-object: make replace operations thread-safe
replace-object functions are very close to being thread-safe: the only
current racy section is the lazy initialization at
prepare_replace_object(). The following patches will protect some object
reading operations to be called threaded, but before that, replace
functions must be protected. To do so, add a mutex to struct
raw_object_store and acquire it before lazy initializing the
replace_map. This won't cause any noticeable performance drop as the
mutex will no longer be used after the replace_map is initialized.
Later, when the replace functions are called in parallel, thread
debuggers might point our use of the added replace_map_initialized flag
as a data race. However, as this boolean variable is initialized as
false and it's only updated once, there's no real harm. It's perfectly
fine if the value is updated right after a thread read it in
replace-map.h:lookup_replace_object() (there'll only be a performance
penalty for the affected threads at that moment). We could cease the
debugger warning protecting the variable reading at the said function.
However, this would negatively affect performance for all threads
calling it, at any time, so it's not really worthy since the warning
doesn't represent a real problem. Instead, to make sure we don't get
false positives (at ThreadSanitizer, at least) an entry for the
respective function is added to .tsan-suppressions.
Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-01-16 10:39:52 +08:00
|
|
|
*
|
|
|
|
* Note: some thread debuggers might point a data race on the
|
|
|
|
* replace_map_initialized reading in this function. However, we know there's no
|
|
|
|
* problem in the value being updated by one thread right after another one read
|
|
|
|
* it here (and it should be written to only once, anyway).
|
2018-04-12 08:21:06 +08:00
|
|
|
*/
|
2018-04-12 08:21:18 +08:00
|
|
|
static inline const struct object_id *lookup_replace_object(struct repository *r,
|
|
|
|
const struct object_id *oid)
|
2018-04-12 08:21:06 +08:00
|
|
|
{
|
2023-06-06 21:24:36 +08:00
|
|
|
if (!replace_refs_enabled(r) ||
|
replace-object: make replace operations thread-safe
replace-object functions are very close to being thread-safe: the only
current racy section is the lazy initialization at
prepare_replace_object(). The following patches will protect some object
reading operations to be called threaded, but before that, replace
functions must be protected. To do so, add a mutex to struct
raw_object_store and acquire it before lazy initializing the
replace_map. This won't cause any noticeable performance drop as the
mutex will no longer be used after the replace_map is initialized.
Later, when the replace functions are called in parallel, thread
debuggers might point our use of the added replace_map_initialized flag
as a data race. However, as this boolean variable is initialized as
false and it's only updated once, there's no real harm. It's perfectly
fine if the value is updated right after a thread read it in
replace-map.h:lookup_replace_object() (there'll only be a performance
penalty for the affected threads at that moment). We could cease the
debugger warning protecting the variable reading at the said function.
However, this would negatively affect performance for all threads
calling it, at any time, so it's not really worthy since the warning
doesn't represent a real problem. Instead, to make sure we don't get
false positives (at ThreadSanitizer, at least) an entry for the
respective function is added to .tsan-suppressions.
Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-01-16 10:39:52 +08:00
|
|
|
(r->objects->replace_map_initialized &&
|
2018-04-12 08:21:18 +08:00
|
|
|
r->objects->replace_map->map.tablesize == 0))
|
2018-04-12 08:21:06 +08:00
|
|
|
return oid;
|
2018-04-12 08:21:18 +08:00
|
|
|
return do_lookup_replace_object(r, oid);
|
2018-04-12 08:21:06 +08:00
|
|
|
}
|
|
|
|
|
2023-06-06 21:24:35 +08:00
|
|
|
/*
|
|
|
|
* Some commands override config and environment settings for using
|
|
|
|
* replace references. Use this method to disable the setting and ensure
|
|
|
|
* those other settings will not override this choice. This applies
|
|
|
|
* globally to all in-process repositories.
|
|
|
|
*/
|
|
|
|
void disable_replace_refs(void);
|
|
|
|
|
2018-04-12 08:21:05 +08:00
|
|
|
#endif /* REPLACE_OBJECT_H */
|