Skip to content

Commit

Permalink
Add test with two kinds of file creation orders
Browse files Browse the repository at this point in the history
Data loss was identified in openzfs#7401 when many small files were copied.
This adds a reproducer for this bug and other similar ones: randomly
generate N files. Then, listing M of them by `ls -U` order, produce
those same files in a directory of the same name.

This triggers the bug consistently, provided N and M are large enough.
Here, N=2^16 and M=2^13.

Reviewed-by: Tony Hutter <hutter2@llnl.gov>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Antonio Russo <antonio.e.russo@gmail.com>
Closes openzfs#7411
  • Loading branch information
aerusso authored and tonyhutter committed May 3, 2018
1 parent 5bfd955 commit 2bb4e7a
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 2 deletions.
2 changes: 1 addition & 1 deletion tests/runfiles/linux.run
Original file line number Diff line number Diff line change
Expand Up @@ -499,7 +499,7 @@ tests = ['umount_001', 'umountall_001']
tags = ['functional', 'mount']

[tests/functional/mv_files]
tests = ['mv_files_001_pos', 'mv_files_002_pos']
tests = ['mv_files_001_pos', 'mv_files_002_pos', 'random_creation']
tags = ['functional', 'mv_files']

[tests/functional/nestedfs]
Expand Down
3 changes: 2 additions & 1 deletion tests/zfs-tests/tests/functional/mv_files/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ dist_pkgdata_SCRIPTS = \
setup.ksh \
cleanup.ksh \
mv_files_001_pos.ksh \
mv_files_002_pos.ksh
mv_files_002_pos.ksh \
random_creation.ksh

dist_pkgdata_DATA = \
mv_files.cfg \
Expand Down
4 changes: 4 additions & 0 deletions tests/zfs-tests/tests/functional/mv_files/mv_files.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,7 @@ export NEWDIR_ACROSS_FS=$TESTDIR_TGT/newdir
export MVNUMFILES=2000 # <number of files to start>
export MVNUMINCR=1000 # <number of files to be increased to>
export GANGPIDS=50 # <number of limit for parallel background running process>

# controls the "random_creation" test
export RC_PASS1=65536 # <number of files to create in the first directory>
export RC_PASS2=8192 # <process this many files into the second directory
48 changes: 48 additions & 0 deletions tests/zfs-tests/tests/functional/mv_files/random_creation.ksh
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#!/bin/ksh -p

source "${STF_SUITE}/include/libtest.shlib"
source "${STF_SUITE}/tests/functional/mv_files/mv_files.cfg"

# This will test the #7401 regression.
log_assert "Check that creating many files quickly is safe"

DIR="${TESTDIR}/RANDOM_SMALL"

log_must mkdir "${DIR}"

count=0
for i in $(shuf -i 1-"${RC_PASS1}") ; do
if ! touch "${DIR}/${i}" ; then
log_fail "error creating ${i} after ${count} files"
fi
count=$((count+1))
done

visible="$(find "${DIR}" -type f|wc -l)"

log_must [ "${visible}" -eq "${RC_PASS1}" ]

log_assert "Check that creating them in another order is safe"

DIR1="${TESTDIR}/RANDOM2"

log_must mv "${DIR}" "${DIR1}"

log_must mkdir "${DIR}"

count=0
for i in $(cd "${DIR1}" ; ls -U . ) ; do
if ! touch "${DIR}/${i}" ; then
log_fail "error creating ${i} after ${count} files"
fi
count=$((count+1))
[ "${count}" -eq "${RC_PASS2}" ] && break
done

visible="$(find "${DIR}" -type f|wc -l)"

if [ "${visible}" -eq "${RC_PASS2}" ] ; then
log_pass "Created all ${RC_PASS2} files"
else
log_fail "Number of created files ${visible} is not ${RC_PASS2}"
fi

0 comments on commit 2bb4e7a

Please sign in to comment.