From: Patrick Steinhardt <ps@pks.im>
To: git@vger.kernel.org
Subject: [PATCH 2/8] p5400: add perf tests for git-receive-pack(1)
Date: Wed, 19 May 2021 21:13:27 +0200 [thread overview]
Message-ID: <f248b41d6e2df2d34a4304e2655df8cb094483e9.1621451532.git.ps@pks.im> (raw)
In-Reply-To: <cover.1621451532.git.ps@pks.im>
[-- Attachment #1: Type: text/plain, Size: 3079 bytes --]
We'll the connectivity check logic for git-receive-pack(1) in the
following commits to make it perform better. As a preparatory step, add
some benchmarks such that we can measure these changes.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
---
t/perf/p5400-receive-pack.sh | 74 ++++++++++++++++++++++++++++++++++++
1 file changed, 74 insertions(+)
create mode 100755 t/perf/p5400-receive-pack.sh
diff --git a/t/perf/p5400-receive-pack.sh b/t/perf/p5400-receive-pack.sh
new file mode 100755
index 0000000000..2b0c89d977
--- /dev/null
+++ b/t/perf/p5400-receive-pack.sh
@@ -0,0 +1,74 @@
+#!/bin/sh
+
+test_description="Tests performance of receive-pack"
+
+. ./perf-lib.sh
+
+test_perf_large_repo
+
+test_expect_success 'setup' '
+ # Create a main branch such that we do not have to rely on any specific
+ # branch to exist in the perf repository.
+ git switch --force-create main &&
+
+ TARGET_REPO_CLONE=$(pwd)/target-clone.git &&
+ git clone --bare --dissociate --branch main "$(pwd)" "$TARGET_REPO_CLONE" &&
+ TARGET_REPO_REFS=$(pwd)/target-refs.git &&
+ git clone --bare --dissociate --branch main "$(pwd)" "$TARGET_REPO_REFS" &&
+ TARGET_REPO_EMPTY=$(pwd)/target-empty.git &&
+ git init --bare "$TARGET_REPO_EMPTY" &&
+
+ # Set up a pre-receive hook such that no refs will ever be changed.
+ # This easily allows multiple perf runs, but still exercises
+ # server-side reference negotiation and checking for consistency.
+ mkdir hooks &&
+ write_script hooks/pre-receive <<-EOF &&
+ #!/bin/sh
+ echo "failed in pre-receive hook"
+ exit 1
+ EOF
+ cat >config <<-EOF &&
+ [core]
+ hooksPath=$(pwd)/hooks
+ EOF
+ GIT_CONFIG_GLOBAL="$(pwd)/config" &&
+ export GIT_CONFIG_GLOBAL &&
+
+ # Create a reference for each commit in the target repository with
+ # extra-refs. While this may be an atypical setup, biggish repositories
+ # easily end up with hundreds of thousands of refs, and this is a good
+ # enough approximation.
+ git -C "$TARGET_REPO_REFS" log --all --format="tformat:create refs/commit/%h %H" |
+ git -C "$TARGET_REPO_REFS" update-ref --stdin &&
+
+ git switch --create updated &&
+ test_commit --no-tag updated
+'
+
+while read name repo
+do
+ refs=("create updated:new")
+
+ # If the target repository is the empty one, then the only thing we can
+ # do is to create a new branch.
+ if test "$repo" != "$TARGET_REPO_EMPTY"
+ then
+ refs+=("update updated:main" "reset main~:main" "delete :main")
+ fi
+
+ while read desc ref
+ do
+ test_expect_success "setup $name $desc" "
+ test_must_fail git push --force '$repo' '$ref' \
+ --receive-pack='tee pack | git receive-pack' 2>err &&
+ grep 'failed in pre-receive hook' err
+ "
+
+ test_perf "receive-pack $name $desc" "
+ git receive-pack '$repo' <pack >negotiation &&
+ grep 'pre-receive hook declined' negotiation
+ "
+ done < <(printf "%s\n" "${refs[@]}")
+done < <(printf "%s\n" "clone $TARGET_REPO_CLONE" "extrarefs $TARGET_REPO_REFS" "empty $TARGET_REPO_EMPTY")
+
+test_done
--
2.31.1
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2021-05-19 19:13 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-05-19 19:13 [PATCH 0/8] Speed up connectivity checks via quarantine dir Patrick Steinhardt
2021-05-19 19:13 ` [PATCH 1/8] perf: fix when running with TEST_OUTPUT_DIRECTORY Patrick Steinhardt
2021-05-20 2:03 ` Chris Torek
2021-05-19 19:13 ` Patrick Steinhardt [this message]
2021-05-20 2:09 ` [PATCH 2/8] p5400: add perf tests for git-receive-pack(1) Chris Torek
2021-05-20 17:04 ` Jeff King
2021-05-21 15:03 ` SZEDER Gábor
2021-05-19 19:13 ` [PATCH 3/8] tmp-objdir: expose function to retrieve path Patrick Steinhardt
2021-05-20 0:16 ` Elijah Newren
2021-05-19 19:13 ` [PATCH 4/8] packfile: have `for_each_file_in_pack_dir()` return error codes Patrick Steinhardt
2021-05-19 19:13 ` [PATCH 5/8] object-file: allow reading loose objects without reading their contents Patrick Steinhardt
2021-05-19 19:13 ` [PATCH 6/8] connected: implement connectivity check via temporary object dirs Patrick Steinhardt
2021-05-19 19:13 ` [PATCH 7/8] receive-pack: skip connectivity checks on delete-only commands Patrick Steinhardt
2021-05-21 18:53 ` Felipe Contreras
2021-05-27 14:38 ` Jeff King
2021-05-19 19:13 ` [PATCH 8/8] receive-pack: check connectivity via quarantined objects Patrick Steinhardt
2021-05-20 2:19 ` [PATCH 0/8] Speed up connectivity checks via quarantine dir Chris Torek
2021-05-20 16:50 ` Jeff King
2021-05-20 21:45 ` Junio C Hamano
2021-05-21 9:30 ` Jeff King
2021-05-21 9:42 ` Patrick Steinhardt
2021-05-21 11:20 ` Ævar Arnfjörð Bjarmason
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f248b41d6e2df2d34a4304e2655df8cb094483e9.1621451532.git.ps@pks.im \
--to=ps@pks.im \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).