Subject: [PATCH v4 0/1] fetch: add trace2 instrumentation

From: "erik chen via GitGitGadget" <[email-masked]>
Date: Mon, 18 Nov 2019 14:52:11 +0000

Add trace2 regions to fetch-pack.c to better track time spent in the various
phases of a fetch:

* matching common remote and local refs
* marking local refs as complete (part of the matching process)

Both of these stages can be slow for repositories with many refs.

Signed-off-by: Erik Chen [email-masked] [[email-masked]]

Erik Chen (1):
  fetch: add trace2 instrumentation

 fetch-pack.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

base-commit: d9f6f3b6195a0ca35642561e530798ad1469bd41
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-451%2Ferikchen%2Ftest12-v4
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-451/erikchen/test12-v4
Pull-Request: https://github.com/gitgitgadget/git/pull/451

Range-diff vs v3:

 1:  364c526a5d ! 1:  508d07a3eb fetch: add trace2 instrumentation
     @@ -6,7 +6,9 @@
          phases of a fetch:
      
              * matching common remote and local refs
     -        * marking local refs as complete (part of the matching process)
     +        * parsing remote refs and finding a cutoff
     +        * marking local refs as complete
     +        * marking complete remote refs as common
      
          Both of these stages can be slow for repositories with many refs.
      
     @@ -21,14 +23,28 @@
       
      +	trace2_region_enter("fetch-pack", "mark_complete_and_common_ref", NULL);
      +
     ++	trace2_region_enter("fetch-pack", "parse_remote_refs_and_find_cutoff", NULL);
       	for (ref = *refs; ref; ref = ref->next) {
       		struct object *o;
       
      @@
     + 		if (!o)
     + 			continue;
     + 
     +-		/* We already have it -- which may mean that we were
     ++		/*
     ++		 * We already have it -- which may mean that we were
     + 		 * in sync with the other side at some time after
     + 		 * that (it is OK if we guess wrong here).
     + 		 */
     +@@
     + 				cutoff = commit->date;
       		}
       	}
     ++	trace2_region_leave("fetch-pack", "parse_remote_refs_and_find_cutoff", NULL);
       
     -+	/* This block marks all local refs as COMPLETE, and then recursively marks all
     ++	/*
     ++	 * This block marks all local refs as COMPLETE, and then recursively marks all
      +	 * parents of those refs as COMPLETE.
      +	 */
      +	trace2_region_enter("fetch-pack", "mark_complete_local_refs", NULL);
     @@ -43,8 +59,17 @@
       
       	/*
       	 * Mark all complete remote refs as common refs.
     + 	 * Don't mark them common yet; the server has to be told so first.
     + 	 */
     ++	trace2_region_enter("fetch-pack", "mark_common_remote_refs", NULL);
     + 	for (ref = *refs; ref; ref = ref->next) {
     + 		struct object *o = deref_tag(the_repository,
     + 					     lookup_object(the_repository,
      @@
     + 		negotiator->known_common(negotiator,
     + 					 (struct commit *)o);
       	}
     ++	trace2_region_leave("fetch-pack", "mark_common_remote_refs", NULL);
       
       	save_commit_buffer = old_save_commit_buffer;
      +	trace2_region_leave("fetch-pack", "mark_complete_and_common_ref", NULL);

-- 
gitgitgadget