From patchwork Thu Feb 28 14:41:27 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Brian Foster X-Patchwork-Id: 10833223 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 32A7E180E for ; Thu, 28 Feb 2019 14:41:32 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 204792F1EA for ; Thu, 28 Feb 2019 14:41:32 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 11C552F1F8; Thu, 28 Feb 2019 14:41:32 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6D19E2F121 for ; Thu, 28 Feb 2019 14:41:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730853AbfB1Olb (ORCPT ); Thu, 28 Feb 2019 09:41:31 -0500 Received: from mx1.redhat.com ([209.132.183.28]:46236 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727854AbfB1Olb (ORCPT ); Thu, 28 Feb 2019 09:41:31 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 48BF732FCD46; Thu, 28 Feb 2019 14:41:30 +0000 (UTC) Received: from bfoster.bos.redhat.com (dhcp-41-66.bos.redhat.com [10.18.41.66]) by smtp.corp.redhat.com (Postfix) with ESMTP id BADFA18661; Thu, 28 Feb 2019 14:41:29 +0000 (UTC) From: Brian Foster To: fstests@vger.kernel.org Cc: Josef Bacik , Amir Goldstein Subject: [PATCH 1/2] common/dmlogwrites: genericize log writes target device Date: Thu, 28 Feb 2019 09:41:27 -0500 Message-Id: <20190228144128.55583-2-bfoster@redhat.com> In-Reply-To: <20190228144128.55583-1-bfoster@redhat.com> References: <20190228144128.55583-1-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.40]); Thu, 28 Feb 2019 14:41:30 +0000 (UTC) Sender: fstests-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: fstests@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The dm-log-writes infrastructure is currently implemented to use SCRATCH_DEV as a hardcoded data device. In preparation to allow use of specialized devices in certain circumstances, genericize the code to allow an arbitrary data device. This requires passing the target device as a parameter to several helper functions from various tests. No functional changes. Signed-off-by: Brian Foster Reviewed-by: Amir Goldstein --- common/dmlogwrites | 24 ++++++++++++++++++------ tests/generic/455 | 8 ++++---- tests/generic/457 | 8 ++++---- tests/generic/470 | 4 ++-- tests/generic/482 | 4 ++-- 5 files changed, 30 insertions(+), 18 deletions(-) diff --git a/common/dmlogwrites b/common/dmlogwrites index b9cbae7a..ae2cbc6a 100644 --- a/common/dmlogwrites +++ b/common/dmlogwrites @@ -32,7 +32,7 @@ _require_log_writes_dax() _require_test_program "log-writes/replay-log" local ret=0 - _log_writes_init + _log_writes_init $SCRATCH_DEV _log_writes_mkfs > /dev/null 2>&1 _log_writes_mount -o dax > /dev/null 2>&1 # Check options to be sure. XFS ignores dax option @@ -47,10 +47,15 @@ _require_log_writes_dax() _log_writes_init() { - local BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV` + blkdev=$1 + + [ -z "$blkdev" ] && _fail \ + "block dev must be specified for _log_writes_init" + + local BLK_DEV_SIZE=`blockdev --getsz $blkdev` LOGWRITES_NAME=logwrites-test LOGWRITES_DMDEV=/dev/mapper/$LOGWRITES_NAME - LOGWRITES_TABLE="0 $BLK_DEV_SIZE log-writes $SCRATCH_DEV $LOGWRITES_DEV" + LOGWRITES_TABLE="0 $BLK_DEV_SIZE log-writes $blkdev $LOGWRITES_DEV" _dmsetup_create $LOGWRITES_NAME --table "$LOGWRITES_TABLE" || \ _fail "failed to create log-writes device" } @@ -82,17 +87,21 @@ _log_writes_unmount() # _log_writes_replay_log # -# This replays the log contained on $LOGWRITES_DEV onto $SCRATCH_DEV upto the +# This replays the log contained on $LOGWRITES_DEV onto blkdev upto the # mark passed in. _log_writes_replay_log() { _mark=$1 + _blkdev=$2 + + [ -z "$_blkdev" ] && _fail \ + "block dev must be specified for _log_writes_replay_log" $here/src/log-writes/replay-log --log $LOGWRITES_DEV --find \ --end-mark $_mark >> $seqres.full 2>&1 [ $? -ne 0 ] && _fail "mark '$_mark' does not exist" - $here/src/log-writes/replay-log --log $LOGWRITES_DEV --replay $SCRATCH_DEV \ + $here/src/log-writes/replay-log --log $LOGWRITES_DEV --replay $_blkdev \ --end-mark $_mark >> $seqres.full 2>&1 [ $? -ne 0 ] && _fail "replay failed" } @@ -150,16 +159,19 @@ _log_writes_find_next_fua() _log_writes_replay_log_range() { local end=$1 + local blkdev=$2 [ -z "$end" ] && _fail \ "end entry must be specified for _log_writes_replay_log_range" + [ -z "$blkdev" ] && _fail \ + "block dev must be specified for _log_writes_replay_log_range" # To ensure we replay the last entry, # we need to manually increase the end entry number to ensure # it's played echo "=== replay to $end ===" >> $seqres.full $here/src/log-writes/replay-log --log $LOGWRITES_DEV \ - --replay $SCRATCH_DEV --limit $(($end + 1)) \ + --replay $blkdev --limit $(($end + 1)) \ >> $seqres.full 2>&1 [ $? -ne 0 ] && _fail "replay failed" } diff --git a/tests/generic/455 b/tests/generic/455 index 6a87b99b..05621220 100755 --- a/tests/generic/455 +++ b/tests/generic/455 @@ -42,7 +42,7 @@ check_files() local filename=$(basename $i) local mark="${filename##*.}" echo "checking $filename" >> $seqres.full - _log_writes_replay_log $filename + _log_writes_replay_log $filename $SCRATCH_DEV _scratch_mount local expected_md5=$(_md5_checksum $i) local md5=$(_md5_checksum $SCRATCH_MNT/$name) @@ -57,7 +57,7 @@ rm -rf $SANITY_DIR mkdir $SANITY_DIR # Create the log -_log_writes_init +_log_writes_init $SCRATCH_DEV _log_writes_mkfs >> $seqres.full 2>&1 @@ -92,7 +92,7 @@ _check_scratch_fs # check pre umount echo "checking pre umount" >> $seqres.full -_log_writes_replay_log last +_log_writes_replay_log last $SCRATCH_DEV _scratch_mount _scratch_unmount _check_scratch_fs @@ -103,7 +103,7 @@ done # Check the end echo "checking post umount" >> $seqres.full -_log_writes_replay_log end +_log_writes_replay_log end $SCRATCH_DEV _scratch_mount for j in `seq 0 $((NUM_FILES-1))`; do md5=$(_md5_checksum $SCRATCH_MNT/testfile$j) diff --git a/tests/generic/457 b/tests/generic/457 index c4c0ca45..82367304 100755 --- a/tests/generic/457 +++ b/tests/generic/457 @@ -44,7 +44,7 @@ check_files() local filename=$(basename $i) local mark="${filename##*.}" echo "checking $filename" >> $seqres.full - _log_writes_replay_log $filename + _log_writes_replay_log $filename $SCRATCH_DEV _scratch_mount local expected_md5=$(_md5_checksum $i) local md5=$(_md5_checksum $SCRATCH_MNT/$name) @@ -59,7 +59,7 @@ rm -rf $SANITY_DIR mkdir $SANITY_DIR # Create the log -_log_writes_init +_log_writes_init $SCRATCH_DEV _log_writes_mkfs >> $seqres.full 2>&1 @@ -96,7 +96,7 @@ _check_scratch_fs # check pre umount echo "checking pre umount" >> $seqres.full -_log_writes_replay_log last +_log_writes_replay_log last $SCRATCH_DEV _scratch_mount _scratch_unmount _check_scratch_fs @@ -107,7 +107,7 @@ done # Check the end echo "checking post umount" >> $seqres.full -_log_writes_replay_log end +_log_writes_replay_log end $SCRATCH_DEV _scratch_mount for j in `seq 0 $((NUM_FILES-1))`; do md5=$(_md5_checksum $SCRATCH_MNT/testfile$j) diff --git a/tests/generic/470 b/tests/generic/470 index a970aa80..93691f4a 100755 --- a/tests/generic/470 +++ b/tests/generic/470 @@ -39,7 +39,7 @@ _require_log_writes_dax _require_xfs_io_command "mmap" "-S" _require_xfs_io_command "log_writes" -_log_writes_init +_log_writes_init $SCRATCH_DEV _log_writes_mkfs >> $seqres.full 2>&1 _log_writes_mount -o dax @@ -58,7 +58,7 @@ _check_scratch_fs _scratch_mkfs >> $seqres.full 2>&1 # check pre-unmap state -_log_writes_replay_log preunmap +_log_writes_replay_log preunmap $SCRATCH_DEV _scratch_mount # We should see $SCRATCH_MNT/test as having 1 MiB in block allocations diff --git a/tests/generic/482 b/tests/generic/482 index 7595aa59..3c2199d7 100755 --- a/tests/generic/482 +++ b/tests/generic/482 @@ -55,7 +55,7 @@ fsstress_args=$(_scale_fsstress_args -w -d $SCRATCH_MNT -n 512 -p $nr_cpus \ $FSSTRESS_AVOID) _test_unmount -_log_writes_init +_log_writes_init $SCRATCH_DEV _log_writes_mkfs >> $seqres.full 2>&1 _log_writes_mark mkfs @@ -70,7 +70,7 @@ cur=$(_log_writes_find_next_fua $prev) [ -z "$cur" ] && _fail "failed to locate next FUA write" while [ ! -z "$cur" ]; do - _log_writes_replay_log_range $cur >> $seqres.full + _log_writes_replay_log_range $cur $SCRATCH_DEV >> $seqres.full # Here we need extra mount to replay the log, mainly for journal based # fs, as their fsck will report dirty log as error. From patchwork Thu Feb 28 14:41:28 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Brian Foster X-Patchwork-Id: 10833225 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id E07BF180E for ; Thu, 28 Feb 2019 14:41:32 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D1E782F121 for ; Thu, 28 Feb 2019 14:41:32 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id CF6F42F1FC; Thu, 28 Feb 2019 14:41:32 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 975742F1CF for ; Thu, 28 Feb 2019 14:41:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727854AbfB1Olb (ORCPT ); Thu, 28 Feb 2019 09:41:31 -0500 Received: from mx1.redhat.com ([209.132.183.28]:37756 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725896AbfB1Olb (ORCPT ); Thu, 28 Feb 2019 09:41:31 -0500 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id CD6C731A5369; Thu, 28 Feb 2019 14:41:30 +0000 (UTC) Received: from bfoster.bos.redhat.com (dhcp-41-66.bos.redhat.com [10.18.41.66]) by smtp.corp.redhat.com (Postfix) with ESMTP id 6485218661; Thu, 28 Feb 2019 14:41:30 +0000 (UTC) From: Brian Foster To: fstests@vger.kernel.org Cc: Josef Bacik , Amir Goldstein Subject: [PATCH 2/2] generic/482: use thin volume as data device Date: Thu, 28 Feb 2019 09:41:28 -0500 Message-Id: <20190228144128.55583-3-bfoster@redhat.com> In-Reply-To: <20190228144128.55583-1-bfoster@redhat.com> References: <20190228144128.55583-1-bfoster@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.43]); Thu, 28 Feb 2019 14:41:30 +0000 (UTC) Sender: fstests-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: fstests@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The dm-log-writes replay mechanism issues discards to provide zeroing functionality to prevent out-of-order replay issues. These discards don't always result in zeroing bevavior, however, depending on the underlying physical device. In turn, this causes test failures on XFS v5 filesystems that enforce metadata log recovery ordering if the filesystem ends up with stale data from the future with respect to the active log at a particular recovery point. To ensure reliable discard zeroing behavior, use a thinly provisioned volume as the data device instead of using the scratch device directly. This slows the test down slightly, but provides reliable functional behavior at a reduced cost from active snapshot management or forced zeroing. Signed-off-by: Brian Foster Reviewed-by: Amir Goldstein --- tests/generic/482 | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/tests/generic/482 b/tests/generic/482 index 3c2199d7..3b93a7fc 100755 --- a/tests/generic/482 +++ b/tests/generic/482 @@ -22,12 +22,14 @@ _cleanup() cd / $KILLALL_PROG -KILL -q $FSSTRESS_PROG &> /dev/null _log_writes_cleanup &> /dev/null + _dmthin_cleanup rm -f $tmp.* } # get standard environment, filters and checks . ./common/rc . ./common/filter +. ./common/dmthin . ./common/dmlogwrites # remove previous $seqres.full before test @@ -44,6 +46,7 @@ _require_command "$KILLALL_PROG" killall _require_scratch # and we need extra device as log device _require_log_writes +_require_dm_target thin-pool nr_cpus=$("$here/src/feature" -o) @@ -53,9 +56,15 @@ if [ $nr_cpus -gt 8 ]; then fi fsstress_args=$(_scale_fsstress_args -w -d $SCRATCH_MNT -n 512 -p $nr_cpus \ $FSSTRESS_AVOID) +devsize=$((1024*1024*200 / 512)) # 200m phys/virt size +csize=$((1024*64 / 512)) # 64k cluster size +lowspace=$((1024*1024 / 512)) # 1m low space threshold +# Use a thin device to provide deterministic discard behavior. Discards are used +# by the log replay tool for fast zeroing to prevent out-of-order replay issues. _test_unmount -_log_writes_init $SCRATCH_DEV +_dmthin_init $devsize $devsize $csize $lowspace +_log_writes_init $DMTHIN_VOL_DEV _log_writes_mkfs >> $seqres.full 2>&1 _log_writes_mark mkfs @@ -70,16 +79,15 @@ cur=$(_log_writes_find_next_fua $prev) [ -z "$cur" ] && _fail "failed to locate next FUA write" while [ ! -z "$cur" ]; do - _log_writes_replay_log_range $cur $SCRATCH_DEV >> $seqres.full + _log_writes_replay_log_range $cur $DMTHIN_VOL_DEV >> $seqres.full # Here we need extra mount to replay the log, mainly for journal based # fs, as their fsck will report dirty log as error. - # We don't care to preserve any data on $SCRATCH_DEV, as we can replay + # We don't care to preserve any data on the replay dev, as we can replay # back to the point we need, and in fact sometimes creating/deleting # snapshots repeatedly can be slower than replaying the log. - _scratch_mount - _scratch_unmount - _check_scratch_fs + _dmthin_mount + _dmthin_check_fs prev=$cur cur=$(_log_writes_find_next_fua $(($cur + 1)))