forked from TrueCloudLab/neoneo-go
cli: add script for comparing storage dumps
It uses jq to normalize and compare json dumps.
This commit is contained in:
parent
b1d9e1132d
commit
a1fecd2e88
1 changed files with 63 additions and 0 deletions
63
scripts/compare-dumps
Executable file
63
scripts/compare-dumps
Executable file
|
@ -0,0 +1,63 @@
|
|||
#!/bin/sh
|
||||
|
||||
ARG1=$1
|
||||
ARG2=$2
|
||||
if [ -z "$ARG1" ] || [ -z "$ARG2" ]; then
|
||||
echo one of the arguments is empty
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
compare() {
|
||||
# replace replaces storage operation from "Changed" to "Added"
|
||||
# normalize replaces performs replace and sorts keys in lexicographic order
|
||||
# next we normalize every json file
|
||||
# and finally compare them as a whole
|
||||
jq --argfile x "$1" --argfile y "$2" \
|
||||
-n 'def replace: map(if (.state == "Changed") then (.state="Added") else . end);
|
||||
def normalize: .storage = (.storage | replace | sort_by(.key));
|
||||
($x | map(normalize)) as $x
|
||||
| ($y | map(normalize)) as $y
|
||||
| $x | range(length) | . as $i | select($x[$i] != $y[$i]) | $x[$i].block | halt_error(1)'
|
||||
}
|
||||
|
||||
if [ -f "$ARG1" ] && [ -f "$ARG2" ]; then
|
||||
compare "$ARG1" "$ARG2"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo failed
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ ! -d "$ARG1" ] || [ ! -d "$ARG2" ]; then
|
||||
echo both arguments must have the same type and exist
|
||||
exit 1
|
||||
fi
|
||||
|
||||
FIRST=$3
|
||||
if [ -z "$FIRST" ]; then
|
||||
FIRST=1
|
||||
fi
|
||||
|
||||
LAST=$4
|
||||
if [ -z "$LAST" ]; then
|
||||
LAST=40 # 40_00000 block
|
||||
fi
|
||||
|
||||
# directories contain 100k blocks
|
||||
for i in `seq $FIRST $LAST`; do
|
||||
dir=BlockStorage_${i}00000
|
||||
echo Processing directory $dir
|
||||
|
||||
# files are grouped by 1k blocks
|
||||
for j in `seq $(((i-1)*100 + 1)) $((i*100))`; do
|
||||
file=dump-block-${j}000.json
|
||||
compare "$ARG1/$dir/$file" "$ARG2/$dir/$file"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo failed on file $dir/$file
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
done
|
Loading…
Reference in a new issue