Add support for the DISCARD file operation. Discard punches a hole in a file in the provided range. Block de-allocation is implemented via fallocate() (as requested via fuse and passed on to the brick fs) but a separate fop is created within gluster to emphasize the fact that discard changes file data (the discarded region is replaced with zeroes) and must invalidate caches where appropriate. BUG: 963678 Change-Id: I34633a0bfff2187afeab4292a15f3cc9adf261af Signed-off-by: Brian Foster <bfoster@redhat.com> Reviewed-on: http://review.gluster.org/5090 Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Anand Avati <avati@redhat.com>
57 lines
1.7 KiB
Bash
57 lines
1.7 KiB
Bash
#!/bin/bash
|
|
#
|
|
# Bug 963678 - Test discard functionality
|
|
#
|
|
# Test that basic discard (hole punch) functionality works via the fallocate
|
|
# command line tool. Hole punch deallocates a region of a file, creating a hole
|
|
# and a zero-filled data region. We verify that hole punch works, frees blocks
|
|
# and that subsequent reads do not read stale data (caches are invalidated).
|
|
#
|
|
# NOTE: fuse fallocate is known to be broken with regard to cache invalidation
|
|
# up to 3.9.0 kernels. Therefore, FOPEN_KEEP_CACHE is not used in this
|
|
# test (opens will invalidate the fuse cache).
|
|
###
|
|
|
|
. $(dirname $0)/../include.rc
|
|
. $(dirname $0)/../fallocate.rc
|
|
|
|
cleanup;
|
|
|
|
TEST glusterd
|
|
|
|
TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2}
|
|
TEST $CLI volume start $V0
|
|
|
|
TEST glusterfs --volfile-id=$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0
|
|
|
|
# check for fallocate and hole punch support
|
|
require_fallocate -l 1m $M0/file
|
|
require_fallocate -p -l 512k $M0/file && rm -f $M0/file
|
|
|
|
# allocate some blocks, punch a hole and verify block allocation
|
|
TEST fallocate -l 1m $M0/file
|
|
blksz=`stat --printf=%B $M0/file`
|
|
nblks=`stat --printf=%b $M0/file`
|
|
TEST [ $(($blksz * $nblks)) -ge 1048576 ]
|
|
TEST fallocate -p -o 512k -l 128k $M0/file
|
|
|
|
nblks=`stat --printf=%b $M0/file`
|
|
# allow some room for xattr blocks
|
|
TEST [ $(($blksz * $nblks)) -lt $((917504 + 16384)) ]
|
|
TEST unlink $M0/file
|
|
|
|
# write some data, punch a hole and verify the file content changes
|
|
TEST dd if=/dev/urandom of=$M0/file bs=1M count=1
|
|
TEST cp $M0/file $M0/file.copy.pre
|
|
TEST fallocate -p -o 512k -l 128k $M0/file
|
|
TEST cp $M0/file $M0/file.copy.post
|
|
TEST ! cmp $M0/file.copy.pre $M0/file.copy.post
|
|
TEST unlink $M0/file
|
|
|
|
TEST umount $M0
|
|
|
|
TEST $CLI volume stop $V0
|
|
TEST $CLI volume delete $V0
|
|
|
|
cleanup;
|