blob: 2667585ca97df3fe4b37d4ce41d9808051f4a216 [file] [log] [blame]
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright 2019 Google LLC
#
# FS QA Test generic/579
#
# Stress test for fs-verity. This tests enabling fs-verity on multiple files
# concurrently with concurrent readers on those files (with reads occurring
# before, during, and after the fs-verity enablement), while fsstress is also
# running on the same filesystem.
#
. ./common/preamble
_begin_fstest auto stress verity
# Override the default cleanup function.
_cleanup()
{
# Stop all subprocesses.
$KILLALL_PROG -q $FSSTRESS_PROG
touch $tmp.done
wait
_restore_fsverity_signatures
rm -f $tmp.*
}
# Import common functions.
. ./common/filter
. ./common/verity
# real QA test starts here
_supported_fs generic
_require_scratch_verity
_require_command "$KILLALL_PROG" killall
_disable_fsverity_signatures
_scratch_mkfs_verity &>> $seqres.full
_scratch_mount
fsv_file_size=10000000
nproc_enabler=$((4 * LOAD_FACTOR))
nproc_reader=$((6 * LOAD_FACTOR))
nproc_stress=$((3 * LOAD_FACTOR))
runtime=$((20 * TIME_FACTOR))
# Create the test files and start the fs-verity enabler processes.
for ((proc = 0; proc < nproc_enabler; proc++)); do
orig_file=$SCRATCH_MNT/orig$proc
fsv_file=$SCRATCH_MNT/fsv$proc
head -c $fsv_file_size /dev/urandom > $orig_file
(
while [ ! -e $tmp.done ]; do
rm -f $fsv_file
cp $orig_file $fsv_file
_fsv_enable $fsv_file
# Give the readers some time to read from the file.
sleep 0.$((RANDOM % 100))
done
) &
done
# Start the reader processes.
for ((proc = 0; proc < nproc_reader; proc++)); do
(
while [ ! -e $tmp.done ]; do
# Choose a random file for each iteration, so that
# sometimes multiple processes read from the same file.
i=$((RANDOM % nproc_enabler))
orig_file=$SCRATCH_MNT/orig$i
fsv_file=$SCRATCH_MNT/fsv$i
# After the copy from $orig_file to $fsv_file has
# completed, the contents of these two files should
# match, regardless of whether verity has been enabled
# or not yet (or is currently being enabled).
cmp $orig_file $fsv_file |& _filter_scratch | \
grep -v "SCRATCH_MNT/fsv$i: No such file or directory" | \
grep -v "EOF on SCRATCH_MNT/fsv$i"
_fsv_measure $fsv_file 2>&1 >/dev/null | \
grep -v "No such file or directory" | \
grep -v "No data available"
done
) &
done
# Start a process that occasionally runs 'sync && drop_caches'. This makes more
# reads go through fs-verity for real, rather than just returning pagecache.
(
while [ ! -e $tmp.done ]; do
sleep 2.$((RANDOM % 100))
sync && echo 3 > /proc/sys/vm/drop_caches
done
) &
# Start the fsstress processes.
$FSSTRESS_PROG $FSSTRESS_AVOID -p $nproc_stress -l 0 -d $SCRATCH_MNT/stressdir \
>> $seqres.full 2>&1 &
# Run for a while.
sleep $runtime
echo "Silence is golden"
# success, all done
status=0
exit