bisect.sh: make it possible to detect commits which fix scan time regressions / improved documentation (#4863)
This commit is contained in:
parent
3658965912
commit
30b3d73229
|
@ -85,9 +85,26 @@ Provide the expected error ID (`unreadVariable`) as the `expected` parameter.
|
||||||
|
|
||||||
## Bisecting scan time regressions
|
## Bisecting scan time regressions
|
||||||
|
|
||||||
We use daca@home to track differences in scan time. An overview of regressions in scan time can be found at http://cppcheck1.osuosl.org:8000/time_gt.html.
|
It is also possible to bisect for a regression in scan time.
|
||||||
|
|
||||||
You need to download the archive as specified by the second line in the output and extract it.
|
This is done by determinaing the time it took for the "good" commit to finish and setting a timeout twice that size for the calls to determine the "bad" commit.
|
||||||
|
|
||||||
|
To bisect these kinds of regressions you currently need to adjust the `bisect.sh` script and set the `hang` variable to appropriate value:<br/>
|
||||||
|
`1` - find the commit which started the hang<br/>
|
||||||
|
`2` - find the commit which resolved the hang<br/>
|
||||||
|
|
||||||
|
### General notes
|
||||||
|
|
||||||
|
As we are currently using the process exitcode to pass the elapsed time to the script it will not work properly with vey long runtime (>= 255 seconds) as it will overflow.
|
||||||
|
|
||||||
|
In case the run-time before the regression was very short (<= 1 second) you might need to adjust the `elapsed_time` variable in `bisect.sh` to a higher value to avoid potential false positives.
|
||||||
|
This might also be necessary to determine one of multiple regressions in the commit range.
|
||||||
|
|
||||||
|
After the bisect finished you should take a look at the output and make sure the elpased time of the repective commit looks as expected.
|
||||||
|
|
||||||
|
### daca@home notes
|
||||||
|
|
||||||
|
We use daca@home to track differences in scan time. An overview of regressions in scan time can be found at http://cppcheck1.osuosl.org:8000/time_gt.html.
|
||||||
|
|
||||||
If the overall scan time regressed you need to specify the whole folder.
|
If the overall scan time regressed you need to specify the whole folder.
|
||||||
|
|
||||||
|
@ -97,6 +114,8 @@ If a timeout (potential hang) was introduced you can simply specify the file fro
|
||||||
|
|
||||||
### Bisecting daca@home issues
|
### Bisecting daca@home issues
|
||||||
|
|
||||||
|
You need to download the archive as specified by the second line in the output and extract it.
|
||||||
|
|
||||||
Use the following data as respective parameters:
|
Use the following data as respective parameters:
|
||||||
|
|
||||||
`hash-good` the latest tagged release - the second value from the `cppcheck:` line<br/>
|
`hash-good` the latest tagged release - the second value from the `cppcheck:` line<br/>
|
||||||
|
|
|
@ -11,6 +11,9 @@ expected=$4
|
||||||
|
|
||||||
# TODO: verify "good" commit happened before "bad" commit
|
# TODO: verify "good" commit happened before "bad" commit
|
||||||
|
|
||||||
|
# 0 - regular result based bisect
|
||||||
|
# 1 - find commit which started hang
|
||||||
|
# 2 - find commit which resolved hang
|
||||||
hang=0
|
hang=0
|
||||||
|
|
||||||
script_dir="$(dirname "$(realpath "$0")")"
|
script_dir="$(dirname "$(realpath "$0")")"
|
||||||
|
@ -48,7 +51,7 @@ git bisect start -- Makefile 'addons/*.py' 'cfg/*.cfg' 'cli/*.cpp' 'cli/*.h' 'ex
|
||||||
|
|
||||||
git checkout "$hash_good" || exit 1
|
git checkout "$hash_good" || exit 1
|
||||||
|
|
||||||
if [ $hang -eq 1 ]; then
|
if [ $hang -ne 0 ]; then
|
||||||
# TODO: exitcode overflow on 255
|
# TODO: exitcode overflow on 255
|
||||||
# get expected time from good commit
|
# get expected time from good commit
|
||||||
python3 "$script_dir/bisect_hang.py" "$bisect_dir" "$options"
|
python3 "$script_dir/bisect_hang.py" "$bisect_dir" "$options"
|
||||||
|
@ -69,8 +72,8 @@ git bisect good || exit 1
|
||||||
git checkout "$hash_bad" || exit 1
|
git checkout "$hash_bad" || exit 1
|
||||||
|
|
||||||
# verify the given commit is actually "bad"
|
# verify the given commit is actually "bad"
|
||||||
if [ $hang -eq 1 ]; then
|
if [ $hang -ne 0 ]; then
|
||||||
python3 "$script_dir/bisect_hang.py" "$bisect_dir" "$options" $elapsed_time
|
python3 "$script_dir/bisect_hang.py" "$bisect_dir" "$options" $elapsed_time $hang
|
||||||
else
|
else
|
||||||
python3 "$script_dir/bisect_res.py" "$bisect_dir" "$options" "$expected"
|
python3 "$script_dir/bisect_res.py" "$bisect_dir" "$options" "$expected"
|
||||||
fi
|
fi
|
||||||
|
@ -84,8 +87,8 @@ fi
|
||||||
git bisect bad || exit 1
|
git bisect bad || exit 1
|
||||||
|
|
||||||
# perform the actual bisect
|
# perform the actual bisect
|
||||||
if [ $hang -eq 1 ]; then
|
if [ $hang -ne 0 ]; then
|
||||||
git bisect run python3 "$script_dir/bisect_hang.py" "$bisect_dir" "$options" $elapsed_time || exit 1
|
git bisect run python3 "$script_dir/bisect_hang.py" "$bisect_dir" "$options" $elapsed_time $hang || exit 1
|
||||||
else
|
else
|
||||||
git bisect run python3 "$script_dir/bisect_res.py" "$bisect_dir" "$options" "$expected" || exit 1
|
git bisect run python3 "$script_dir/bisect_res.py" "$bisect_dir" "$options" "$expected" || exit 1
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -33,10 +33,14 @@ bisect_path = sys.argv[1]
|
||||||
options = sys.argv[2]
|
options = sys.argv[2]
|
||||||
if '--error-exitcode=0' not in options:
|
if '--error-exitcode=0' not in options:
|
||||||
options += ' --error-exitcode=0'
|
options += ' --error-exitcode=0'
|
||||||
if len(sys.argv) == 4:
|
if len(sys.argv) >= 4:
|
||||||
elapsed_time = float(sys.argv[3])
|
elapsed_time = float(sys.argv[3])
|
||||||
else:
|
else:
|
||||||
elapsed_time = None
|
elapsed_time = None
|
||||||
|
if len(sys.argv) == 5:
|
||||||
|
invert = sys.argv[4] == "2"
|
||||||
|
else:
|
||||||
|
invert = False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
cppcheck_path = build_cppcheck(bisect_path)
|
cppcheck_path = build_cppcheck(bisect_path)
|
||||||
|
@ -68,8 +72,8 @@ if run_res is None:
|
||||||
sys.exit(EC_SKIP) # error occured
|
sys.exit(EC_SKIP) # error occured
|
||||||
|
|
||||||
if not run_res:
|
if not run_res:
|
||||||
sys.exit(EC_BAD) # timeout occured
|
sys.exit(EC_BAD if not invert else EC_GOOD) # timeout occured
|
||||||
|
|
||||||
print('run_time: {}'.format(run_time))
|
print('run_time: {}'.format(run_time))
|
||||||
|
|
||||||
sys.exit(EC_GOOD) # no timeout
|
sys.exit(EC_GOOD if not invert else EC_BAD) # no timeout
|
||||||
|
|
Loading…
Reference in New Issue