t / perf / p5551-fetch-rescan.shon commit Sync with maint (be9f1c0)
   1#!/bin/sh
   2
   3test_description='fetch performance with many packs
   4
   5It is common for fetch to consider objects that we might not have, and it is an
   6easy mistake for the code to use a function like `parse_object` that might
   7give the correct _answer_ on such an object, but do so slowly (due to
   8re-scanning the pack directory for lookup failures).
   9
  10The resulting performance drop can be hard to notice in a real repository, but
  11becomes quite large in a repository with a large number of packs. So this
  12test creates a more pathological case, since any mistakes would produce a more
  13noticeable slowdown.
  14'
  15. ./perf-lib.sh
  16. "$TEST_DIRECTORY"/perf/lib-pack.sh
  17
  18test_expect_success 'create parent and child' '
  19        git init parent &&
  20        git clone parent child
  21'
  22
  23
  24test_expect_success 'create refs in the parent' '
  25        (
  26                cd parent &&
  27                git commit --allow-empty -m foo &&
  28                head=$(git rev-parse HEAD) &&
  29                test_seq 1000 |
  30                sed "s,.*,update refs/heads/& $head," |
  31                $MODERN_GIT update-ref --stdin
  32        )
  33'
  34
  35test_expect_success 'create many packs in the child' '
  36        (
  37                cd child &&
  38                setup_many_packs
  39        )
  40'
  41
  42test_perf 'fetch' '
  43        # start at the same state for each iteration
  44        obj=$($MODERN_GIT -C parent rev-parse HEAD) &&
  45        (
  46                cd child &&
  47                $MODERN_GIT for-each-ref --format="delete %(refname)" refs/remotes |
  48                $MODERN_GIT update-ref --stdin &&
  49                rm -vf .git/objects/$(echo $obj | sed "s|^..|&/|") &&
  50
  51                git fetch
  52        )
  53'
  54
  55test_done