You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
257 lines
5.5 KiB
257 lines
5.5 KiB
#!/bin/sh |
|
|
|
test_description="Perf test for the builtin FSMonitor" |
|
|
|
. ./perf-lib.sh |
|
|
|
if ! test_have_prereq FSMONITOR_DAEMON |
|
then |
|
skip_all="fsmonitor--daemon is not supported on this platform" |
|
test_done |
|
fi |
|
|
|
test_lazy_prereq UNTRACKED_CACHE ' |
|
{ git update-index --test-untracked-cache; ret=$?; } && |
|
test $ret -ne 1 |
|
' |
|
|
|
# Lie to perf-lib and ask for a new empty repo and avoid |
|
# the complaints about GIT_PERF_REPO not being big enough |
|
# the perf hit when GIT_PERF_LARGE_REPO is copied into |
|
# the trash directory. |
|
# |
|
# NEEDSWORK: It would be nice if perf-lib had an option to |
|
# "borrow" an existing large repo (especially for gigantic |
|
# monorepos) and use it in-place. For now, fake it here. |
|
# |
|
test_perf_fresh_repo |
|
|
|
|
|
# Use a generated synthetic monorepo. If it doesn't exist, we will |
|
# generate it. If it does exist, we will put it in a known state |
|
# before we start our timings. |
|
# |
|
PARAM_D=5 |
|
PARAM_W=10 |
|
PARAM_F=9 |
|
|
|
PARAMS="$PARAM_D"."$PARAM_W"."$PARAM_F" |
|
|
|
BALLAST_BR=p0006-ballast |
|
export BALLAST_BR |
|
|
|
TMP_BR=tmp_br |
|
export TMP_BR |
|
|
|
REPO=../repos/gen-many-files-"$PARAMS".git |
|
export REPO |
|
|
|
if ! test -d $REPO |
|
then |
|
(cd ../repos; ./many-files.sh -d $PARAM_D -w $PARAM_W -f $PARAM_F) |
|
fi |
|
|
|
|
|
enable_uc () { |
|
git -C $REPO config core.untrackedcache true |
|
git -C $REPO update-index --untracked-cache |
|
git -C $REPO status >/dev/null 2>&1 |
|
} |
|
|
|
disable_uc () { |
|
git -C $REPO config core.untrackedcache false |
|
git -C $REPO update-index --no-untracked-cache |
|
git -C $REPO status >/dev/null 2>&1 |
|
} |
|
|
|
start_fsm () { |
|
git -C $REPO fsmonitor--daemon start |
|
git -C $REPO fsmonitor--daemon status |
|
git -C $REPO config core.fsmonitor true |
|
git -C $REPO update-index --fsmonitor |
|
git -C $REPO status >/dev/null 2>&1 |
|
} |
|
|
|
stop_fsm () { |
|
git -C $REPO config --unset core.fsmonitor |
|
git -C $REPO update-index --no-fsmonitor |
|
test_might_fail git -C $REPO fsmonitor--daemon stop 2>/dev/null |
|
git -C $REPO status >/dev/null 2>&1 |
|
} |
|
|
|
|
|
# Ensure that FSMonitor is turned off on the borrowed repo. |
|
# |
|
test_expect_success "Setup borrowed repo (fsm+uc)" " |
|
stop_fsm && |
|
disable_uc |
|
" |
|
|
|
# Also ensure that it starts in a known state. |
|
# |
|
# Because we assume that $GIT_PERF_REPEAT_COUNT > 1, we are not going to time |
|
# the ballast checkout, since only the first invocation does any work and the |
|
# subsequent ones just print "already on branch" and quit, so the reported |
|
# time is not useful. |
|
# |
|
# Create a temp branch and do all work relative to it so that we don't |
|
# accidentially alter the real ballast branch. |
|
# |
|
test_expect_success "Setup borrowed repo (temp ballast branch)" " |
|
test_might_fail git -C $REPO checkout $BALLAST_BR && |
|
test_might_fail git -C $REPO reset --hard && |
|
git -C $REPO clean -d -f && |
|
test_might_fail git -C $REPO branch -D $TMP_BR && |
|
git -C $REPO branch $TMP_BR $BALLAST_BR && |
|
git -C $REPO checkout $TMP_BR |
|
" |
|
|
|
|
|
echo Data >data.txt |
|
|
|
# NEEDSWORK: We assume that $GIT_PERF_REPEAT_COUNT > 1. With |
|
# FSMonitor enabled, we can get a skewed view of status times, since |
|
# the index MAY (or may not) be updated after the first invocation |
|
# which will update the FSMonitor Token, so the subsequent invocations |
|
# may get a smaller response from the daemon. |
|
# |
|
do_status () { |
|
msg=$1 |
|
|
|
test_perf "$msg" " |
|
git -C $REPO status >/dev/null 2>&1 |
|
" |
|
} |
|
|
|
do_matrix () { |
|
uc=$1 |
|
fsm=$2 |
|
|
|
t="[uc $uc][fsm $fsm]" |
|
MATRIX_BR="$TMP_BR-$uc-$fsm" |
|
|
|
test_expect_success "$t Setup matrix branch" " |
|
git -C $REPO clean -d -f && |
|
git -C $REPO checkout $TMP_BR && |
|
test_might_fail git -C $REPO branch -D $MATRIX_BR && |
|
git -C $REPO branch $MATRIX_BR $TMP_BR && |
|
git -C $REPO checkout $MATRIX_BR |
|
" |
|
|
|
if test $uc = true |
|
then |
|
enable_uc |
|
else |
|
disable_uc |
|
fi |
|
|
|
if test $fsm = true |
|
then |
|
start_fsm |
|
else |
|
stop_fsm |
|
fi |
|
|
|
do_status "$t status after checkout" |
|
|
|
# Modify many files in the matrix branch. |
|
# Stage them. |
|
# Commit them. |
|
# Rollback. |
|
# |
|
test_expect_success "$t modify tracked files" " |
|
find $REPO -name file1 -exec cp data.txt {} \\; |
|
" |
|
|
|
do_status "$t status after big change" |
|
|
|
# Don't bother timing the "add" because _REPEAT_COUNT |
|
# issue described above. |
|
# |
|
test_expect_success "$t add all" " |
|
git -C $REPO add -A |
|
" |
|
|
|
do_status "$t status after add all" |
|
|
|
test_expect_success "$t add dot" " |
|
git -C $REPO add . |
|
" |
|
|
|
do_status "$t status after add dot" |
|
|
|
test_expect_success "$t commit staged" " |
|
git -C $REPO commit -a -m data |
|
" |
|
|
|
do_status "$t status after commit" |
|
|
|
test_expect_success "$t reset HEAD~1 hard" " |
|
git -C $REPO reset --hard HEAD~1 >/dev/null 2>&1 |
|
" |
|
|
|
do_status "$t status after reset hard" |
|
|
|
# Create some untracked files. |
|
# |
|
test_expect_success "$t create untracked files" " |
|
cp -R $REPO/ballast/dir1 $REPO/ballast/xxx1 |
|
" |
|
|
|
do_status "$t status after create untracked files" |
|
|
|
# Remove the new untracked files. |
|
# |
|
test_expect_success "$t clean -df" " |
|
git -C $REPO clean -d -f |
|
" |
|
|
|
do_status "$t status after clean" |
|
|
|
if test $fsm = true |
|
then |
|
stop_fsm |
|
fi |
|
} |
|
|
|
# Begin testing each case in the matrix that we care about. |
|
# |
|
uc_values="false" |
|
test_have_prereq UNTRACKED_CACHE && uc_values="false true" |
|
|
|
fsm_values="false true" |
|
|
|
for uc_val in $uc_values |
|
do |
|
for fsm_val in $fsm_values |
|
do |
|
do_matrix $uc_val $fsm_val |
|
done |
|
done |
|
|
|
cleanup () { |
|
uc=$1 |
|
fsm=$2 |
|
|
|
MATRIX_BR="$TMP_BR-$uc-$fsm" |
|
|
|
test_might_fail git -C $REPO branch -D $MATRIX_BR |
|
} |
|
|
|
|
|
# We're borrowing this repo. We should leave it in a clean state. |
|
# |
|
test_expect_success "Cleanup temp and matrix branches" " |
|
git -C $REPO clean -d -f && |
|
test_might_fail git -C $REPO checkout $BALLAST_BR && |
|
test_might_fail git -C $REPO branch -D $TMP_BR && |
|
for uc_val in $uc_values |
|
do |
|
for fsm_val in $fsm_values |
|
do |
|
cleanup $uc_val $fsm_val |
|
done |
|
done |
|
" |
|
|
|
test_done
|
|
|