Administrators of a managed Git environment (like the one at $DAYJOB) might want to quantify the performance change of fetches with and without filters from the client's point of view, and also detect if a server does not support it. Therefore, log the filter information being sent to the server whenever a fetch (or clone) occurs. Note that this is not necessarily the same as what's specified on the CLI, because during a fetch, the configured filter is used whenever a filter is not specified on the CLI. Signed-off-by: Jonathan Tan <jonathantanmy@xxxxxxxxxx> --- Here's v3, with an updated function name. --- Range-diff against v2: 1: d3ea7d3b95 ! 1: 17cef49fcc fetch-pack: write effective filter to trace2 @@ Commit message Signed-off-by: Jonathan Tan <jonathantanmy@xxxxxxxxxx> --- - Thanks everyone for your comments. I've renamed the keys and - distinguished the case in which the server does not support filters - following Jeff's suggestions. - - A few small discussion points: - - whether we need the print_verbose now that we have traces - - should we log if no filter is specified - - if yes, what key should it be logged under (I used "filter/none" for - now) + Here's v3, with an updated function name. ## fetch-pack.c ## @@ fetch-pack.c: static void mark_tips(struct fetch_negotiator *negotiator, return; } -+static void write_and_trace_filter(struct fetch_pack_args *args, -+ struct strbuf *req_buf, -+ int server_supports_filter) ++static void send_filter(struct fetch_pack_args *args, ++ struct strbuf *req_buf, ++ int server_supports_filter) +{ + if (args->filter_options.choice) { + const char *spec = @@ fetch-pack.c: static int find_common(struct fetch_negotiator *negotiator, - expand_list_objects_filter_spec(&args->filter_options); - packet_buf_write(&req_buf, "filter %s", spec); - } -+ write_and_trace_filter(args, &req_buf, server_supports_filtering); ++ send_filter(args, &req_buf, server_supports_filtering); packet_buf_flush(&req_buf); state_len = req_buf.len; @@ fetch-pack.c: static int send_fetch_request(struct fetch_negotiator *negotiator, - } else if (args->filter_options.choice) { - warning("filtering not recognized by server, ignoring"); - } -+ write_and_trace_filter(args, &req_buf, -+ server_supports_feature("fetch", "filter", 0)); ++ send_filter(args, &req_buf, ++ server_supports_feature("fetch", "filter", 0)); if (server_supports_feature("fetch", "packfile-uris", 0)) { int i; fetch-pack.c | 40 ++++++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/fetch-pack.c b/fetch-pack.c index cb6647d657..a44eb32a71 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -292,6 +292,29 @@ static void mark_tips(struct fetch_negotiator *negotiator, return; } +static void send_filter(struct fetch_pack_args *args, + struct strbuf *req_buf, + int server_supports_filter) +{ + if (args->filter_options.choice) { + const char *spec = + expand_list_objects_filter_spec(&args->filter_options); + if (server_supports_filter) { + print_verbose(args, _("Server supports filter")); + packet_buf_write(req_buf, "filter %s", spec); + trace2_data_string("fetch", the_repository, + "filter/effective", spec); + } else { + warning("filtering not recognized by server, ignoring"); + trace2_data_string("fetch", the_repository, + "filter/unsupported", spec); + } + } else { + trace2_data_string("fetch", the_repository, + "filter/none", ""); + } +} + static int find_common(struct fetch_negotiator *negotiator, struct fetch_pack_args *args, int fd[2], struct object_id *result_oid, @@ -389,11 +412,7 @@ static int find_common(struct fetch_negotiator *negotiator, packet_buf_write(&req_buf, "deepen-not %s", s->string); } } - if (server_supports_filtering && args->filter_options.choice) { - const char *spec = - expand_list_objects_filter_spec(&args->filter_options); - packet_buf_write(&req_buf, "filter %s", spec); - } + send_filter(args, &req_buf, server_supports_filtering); packet_buf_flush(&req_buf); state_len = req_buf.len; @@ -1323,15 +1342,8 @@ static int send_fetch_request(struct fetch_negotiator *negotiator, int fd_out, die(_("Server does not support shallow requests")); /* Add filter */ - if (server_supports_feature("fetch", "filter", 0) && - args->filter_options.choice) { - const char *spec = - expand_list_objects_filter_spec(&args->filter_options); - print_verbose(args, _("Server supports filter")); - packet_buf_write(&req_buf, "filter %s", spec); - } else if (args->filter_options.choice) { - warning("filtering not recognized by server, ignoring"); - } + send_filter(args, &req_buf, + server_supports_feature("fetch", "filter", 0)); if (server_supports_feature("fetch", "packfile-uris", 0)) { int i; -- 2.37.1.359.gd136c6c3e2-goog