]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Add test with two kinds of file creation orders
authorAntonio Russo <antonio.e.russo@gmail.com>
Mon, 30 Apr 2018 17:45:47 +0000 (13:45 -0400)
committerTony Hutter <hutter2@llnl.gov>
Tue, 8 May 2018 00:19:57 +0000 (17:19 -0700)
Data loss was identified in #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 #7411

tests/runfiles/linux.run
tests/zfs-tests/tests/functional/mv_files/Makefile.am
tests/zfs-tests/tests/functional/mv_files/mv_files.cfg
tests/zfs-tests/tests/functional/mv_files/random_creation.ksh [new file with mode: 0755]

index a0c23a7d66d72826ca324e1c1e6671de99ea7273..272c8c77330ac8b1b477a9732477da971a315d76 100644 (file)
@@ -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]
index 16a9c65eb5f411781f21c5c7b4fedf9762c8c662..cec02140e307f2a3583c1712168106b15ca3a747 100644 (file)
@@ -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 \
index ac81bd3608024b1a5e74195f9f3897440c23cce0..ed28ff1efd279bfc78c20b3afd78be7d29c8f091 100644 (file)
@@ -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
diff --git a/tests/zfs-tests/tests/functional/mv_files/random_creation.ksh b/tests/zfs-tests/tests/functional/mv_files/random_creation.ksh
new file mode 100755 (executable)
index 0000000..45c46f8
--- /dev/null
@@ -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