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