5f44324 (core: log offset pack data accesses happened - 2011-07-06) provides a way to observe pack access patterns via a config switch. Setting an environment variable looks more obvious than a config var, especially when you just need to _observe_, and more inline with other tracing knobs we have. Document it as it may be useful for remote troubleshooting. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- >> + if (!*log_pack_access) { >> + log_pack_access = getenv("GIT_TRACE_PACK_ACCESS"); >> + if (!*log_pack_access) >> + log_pack_access = NULL; >> + if (!log_pack_access) >> + return; >> + } > > Have you ever tested this? > > Once log_pack_access goes to NULL (e.g. when it sees the empty > string it was initialized to), this new test will happily > dereference NULL. My bad. I did test when GIT_TRACE_PACK_ACCESS was set, not when it was set to an empty string. All cases tested now. Documentation/git.txt | 7 +++++++ cache.h | 3 --- config.c | 3 --- sha1_file.c | 10 ++++++++++ 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/Documentation/git.txt b/Documentation/git.txt index 68f1ee6..c760918 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -838,6 +838,13 @@ for further details. as a file path and will try to write the trace messages into it. +'GIT_TRACE_PACK_ACCESS':: + If this variable is set to a path, a file will be created at + the given path logging all accesses to any packs. For each + access, the pack file name and an offset in the pack is + recorded. This may be helpful for troubleshooting some + pack-related performance problems. + GIT_LITERAL_PATHSPECS:: Setting this variable to `1` will cause Git to treat all pathspecs literally, rather than as glob patterns. For example, diff --git a/cache.h b/cache.h index df532f8..4f41606 100644 --- a/cache.h +++ b/cache.h @@ -772,9 +772,6 @@ extern int parse_sha1_header(const char *hdr, unsigned long *sizep); /* global flag to enable extra checks when accessing packed objects */ extern int do_check_packed_object_crc; -/* for development: log offset of pack access */ -extern const char *log_pack_access; - extern int check_sha1_signature(const unsigned char *sha1, void *buf, unsigned long size, const char *type); extern int move_temp_to_file(const char *tmpfile, const char *filename); diff --git a/config.c b/config.c index 830ee14..e68184f 100644 --- a/config.c +++ b/config.c @@ -675,9 +675,6 @@ static int git_default_core_config(const char *var, const char *value) return 0; } - if (!strcmp(var, "core.logpackaccess")) - return git_config_string(&log_pack_access, var, value); - if (!strcmp(var, "core.autocrlf")) { if (value && !strcasecmp(value, "input")) { if (core_eol == EOL_CRLF) diff --git a/sha1_file.c b/sha1_file.c index 67e815b..91c3627 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -36,6 +36,8 @@ static inline uintmax_t sz_fmt(size_t s) { return s; } const unsigned char null_sha1[20]; +static const char *log_pack_access = ""; + /* * This is meant to hold a *small* number of objects that you would * want read_sha1_file() to be able to return, but yet you do not want @@ -1956,6 +1958,14 @@ static void write_pack_access_log(struct packed_git *p, off_t obj_offset) { static FILE *log_file; + if (!*log_pack_access) { + log_pack_access = getenv("GIT_TRACE_PACK_ACCESS"); + if (log_pack_access && !*log_pack_access) + log_pack_access = NULL; + if (!log_pack_access) + return; + } + if (!log_file) { log_file = fopen(log_pack_access, "w"); if (!log_file) { -- 1.8.2.83.gc99314b -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html