Generate a random interval set, then flush and reload it a few times. Note that this test fails with several up-to-date distros that lack nft commit e83e32c8d1cd ("mnl: restore create element command with large batches"). This hints that we will likely need to revert 648946966a08 ("netfilter: nft_set_rbtree: validate open interval overlap") soon, or risk major breakage in most current distros . Signed-off-by: Florian Westphal --- .../transactions/dumps/large_rbtree.nodump | 0 .../testcases/transactions/large_rbtree.sh | 123 ++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 tests/shell/testcases/transactions/dumps/large_rbtree.nodump create mode 100755 tests/shell/testcases/transactions/large_rbtree.sh diff --git a/tests/shell/testcases/transactions/dumps/large_rbtree.nodump b/tests/shell/testcases/transactions/dumps/large_rbtree.nodump new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/tests/shell/testcases/transactions/large_rbtree.sh b/tests/shell/testcases/transactions/large_rbtree.sh new file mode 100755 index 000000000000..09b16c5d70e9 --- /dev/null +++ b/tests/shell/testcases/transactions/large_rbtree.sh @@ -0,0 +1,123 @@ +#!/bin/bash + +# load+reload a large, randomly generated rbtree set + +set -e + +MAXSIZE=50000 +tmpfile=$(mktemp) + +cleanup() +{ + # error? Dump the failed set + test -r "$tmpfile" && cat "$tmpfile" + rm -f "$tmpfile" +} +trap cleanup EXIT + +create_elements() { + local howmany=$1 + local a=10 + local b=0 + local c=0 + local d=1 + local e=0 + local i=0 + + while [ $i -le $howmany ];do + local step1=$((RANDOM%50)) + d=$((d+step1)) + if [ $d -ge 256 ];then + d=1 + c=$((c+1)) + fi + + if [ $c -ge 256 ];then + b=$((b+1)) + c=0 + fi + + if [ $b -ge 256 ];then + a=$((a+1)) + b=0 + fi + + echo -n "$a.$b.$c.$d-" + + local step2=$((RANDOM%10)) + e=$((d+step2)) + d=$((e+1)) + if [ $e -ge 256 ];then + e=0 + c=$((c+1)) + fi + + if [ $c -ge 256 ];then + b=$((b+1)) + c=0 + fi + + if [ $b -ge 256 ];then + a=$((a+1)) + b=0 + fi + + echo -n "$a.$b.$c.$e" + [ $i -lt $howmany ] && echo ", " + i=$((i+1)) + done + + echo "}" +} + +create_set() { +cat - < "$tmpfile" + +# load set +$NFT -f "$tmpfile" + +# flush + reload the same, then different sets +reloads=$(((RANDOM%5)+1)) +for i in $(seq 1 $reloads); do + echo reload: + wc -l $tmpfile + ( echo flush set t s ; cat "$tmpfile" ) | $NFT -f - + recreate_set > "$tmpfile" +done + +rm -f "$tmpfile" -- 2.52.0