check_and_setup_lustre
-if [[ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.12.52) ]]; then
- skip_env "Need MDS version at least 2.12.52" && exit
+if [[ "$MDS1_VERSION" -lt $(version_code 2.12.52) ]]; then
+ skip "Need MDS version at least 2.12.52"
fi
# $RUNAS_ID may get set incorrectly somewhere else
do_facet $facet $LCTL pcc add $MOUNT $hsm_root -p $param
}
+setup_loopdev() {
+ local facet=$1
+ local file=$2
+ local mntpt=$3
+ local size=${4:-50}
+
+ do_facet $facet mkdir -p $mntpt || error "mkdir -p $hsm_root failed"
+ stack_trap "do_facet $facet rm -rf $mntpt" EXIT
+ do_facet $facet dd if=/dev/zero of=$file bs=1M count=$size
+ stack_trap "do_facet $facet rm -f $file" EXIT
+ do_facet $facet mkfs.ext4 $file ||
+ error "mkfs.ext4 $file failed"
+ do_facet $facet file $file
+ do_facet $facet mount -t ext4 -o loop,usrquota,grpquota $file $mntpt ||
+ error "mount -o loop,usrquota,grpquota $file $mntpt failed"
+ stack_trap "do_facet $facet $UMOUNT $mntpt" EXIT
+}
+
lpcc_rw_test() {
local restore="$1"
local project="$2"
local project_id=100
local agt_facet=$SINGLEAGT
- local hsm_root=$(hsm_root)
+ local loopfile="$TMP/$tfile"
+ local mntpt="/mnt/pcc.$tdir"
+ local hsm_root="$mntpt/$tdir"
local file=$DIR/$tdir/$tfile
local -a state
local -a lpcc_path
$project && enable_project_quota
do_facet $SINGLEAGT rm -rf $hsm_root
+ setup_loopdev $SINGLEAGT $loopfile $mntpt 50
copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
is_project_quota_supported || project=false
local -a lpcc_path
copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
- setup_pcc_mapping
+ setup_pcc_mapping $SINGLEAGT \
+ "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0"
$LCTL pcc list $MOUNT
mkdir $DIR/$tdir || error "mkdir $DIR/$tdir failed"
chmod 777 $DIR/$tdir || error "chmod 777 $DIR/$tdir failed"
test_1f() {
local project_id=100
local agt_facet=$SINGLEAGT
- local hsm_root=$(hsm_root)
+ local loopfile="$TMP/$tfile"
+ local mntpt="/mnt/pcc.$tdir"
+ local hsm_root="$mntpt/$tdir"
local file=$DIR/$tdir/$tfile
! is_project_quota_supported &&
skip "project quota is not supported"
enable_project_quota
+ setup_loopdev $SINGLEAGT $loopfile $mntpt 50
copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
- setup_pcc_mapping
+ setup_pcc_mapping $SINGLEAGT \
+ "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ open_attach=0\ stat_attach=0"
+
do_facet $SINGLEAGT mkdir -p $DIR/$tdir
chmod 777 $DIR/$tdir || error "chmod 0777 $DIR/$tdir failed"
$LFS project -sp $project_id $DIR/$tdir ||
error "failed to truncate $file"
do_facet $SINGLEAGT $RUNAS $TRUNCATE $file 2048 ||
error "failed to truncate $file"
- do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$file bs=1024 count=1 ||
+ do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$file bs=256 count=1 ||
error "failed to dd write from $file"
check_lpcc_state $file "readwrite"
do_facet $SINGLEAGT $RUNAS $LFS pcc detach $file ||
error "failed to detach file $file"
- check_lpcc_state $file "none"
wait_request_state $(path2fid $file) REMOVE SUCCEED
+ check_lpcc_state $file "none"
}
run_test 1f "Test auto RW-PCC cache with non-root user"
test_1g() {
+ local loopfile="$TMP/$tfile"
+ local mntpt="/mnt/pcc.$tdir"
+ local hsm_root="$mntpt/$tdir"
local file=$DIR/$tfile
+ setup_loopdev $SINGLEAGT $loopfile $mntpt 50
copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
setup_pcc_mapping
test_2a() {
local project_id=100
local agt_facet=$SINGLEAGT
- local hsm_root=$(hsm_root)
+ local loopfile="$TMP/$tfile"
+ local mntpt="/mnt/pcc.$tdir"
+ local hsm_root="$mntpt/$tdir"
local agt_host=$(facet_active_host $SINGLEAGT)
! is_project_quota_supported &&
skip "project quota is not supported" && return
enable_project_quota
+ setup_loopdev $SINGLEAGT $loopfile $mntpt 50
copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
setup_pcc_mapping
file=$DIR/$tdir/multiop
# HSM released exists archived status
check_hsm_flags $file "0x0000000d"
+ do_facet $SINGLEAGT $LFS pcc detach $file ||
+ error "failed to detach $file"
rmultiop_stop $agt_host || error "close $file failed"
}
run_test 2a "Test multi open when creating"
#
test_2b() {
local agt_facet=$SINGLEAGT
- local hsm_root=$(hsm_root)
local agt_host=$(facet_active_host $SINGLEAGT)
+ local loopfile="$TMP/$tfile"
+ local mntpt="/mnt/pcc.$tdir"
+ local hsm_root="$mntpt/$tdir"
needclients 2 || return 0
remote_client=$(get_remote_client)
enable_project_quota
+ setup_loopdev $SINGLEAGT $loopfile $mntpt 50
copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
setup_pcc_mapping
file=$DIR/$tdir/multiop
test_2c() {
local agt_host=$(facet_active_host $SINGLEAGT)
+ local loopfile="$TMP/$tfile"
+ local mntpt="/mnt/pcc.$tdir"
+ local hsm_root="$mntpt/$tdir"
local file=$DIR/$tdir/$tfile
local file2=$DIR2/$tdir/$tfile
enable_project_quota
+ setup_loopdev $SINGLEAGT $loopfile $mntpt 50
copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
setup_pcc_mapping
mkdir -p $DIR/$tdir
local file=$DIR/$tdir/$tfile
copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
- setup_pcc_mapping
+ setup_pcc_mapping $SINGLEAGT \
+ "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0"
mkdir -p $DIR/$tdir || error "mkdir $DIR/$tdir failed"
dd if=/dev/zero of=$file bs=1024 count=1 ||
# Start all of the copytools and setup PCC
for n in $(seq $AGTCOUNT); do
copytool setup -f agt$n -a $n -m $MOUNT
- setup_pcc_mapping agt$n "projid={100}\ rwid=$n"
+ setup_pcc_mapping agt$n "projid={100}\ rwid=$n\ auto_attach=0"
done
mkdir -p $DIR/$tdir || error "mkdir $DIR/$tdir failed"
test_4() {
local project_id=100
+ local loopfile="$TMP/$tfile"
+ local mntpt="/mnt/pcc.$tdir"
+ local hsm_root="$mntpt/$tdir"
! is_project_quota_supported &&
skip "project quota is not supported" && return
enable_project_quota
+ setup_loopdev $SINGLEAGT $loopfile $mntpt 50
copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
setup_pcc_mapping
# mmap_sanity tst7 failed on the local ext4 filesystem.
# It seems that Lustre filesystem does special process for tst 7.
# Thus, we exclude tst7 from the PCC testing.
- $LUSTRE/tests/mmap_sanity -d $DIR/$tdir -m $DIR2/$tdir -e 7 ||
+ # There is a mmap problem for PCC when multiple clients read/write
+ # on a shared mmapped file. Thus, we exclude mmap_sanity tst6 from
+ # the PCC tesing.
+ $LUSTRE/tests/mmap_sanity -d $DIR/$tdir -m $DIR2/$tdir -e 6 -e 7 ||
error "mmap_sanity test failed"
sync; sleep 1; sync
+
+ rm -rf $DIR/$tdir || error "failed to remove $DIR/$tdir"
}
run_test 4 "Auto cache test for mmap"
test_5() {
local file=$DIR/$tfile
+ local loopfile="$TMP/$tfile"
+ local mntpt="/mnt/pcc.$tdir"
+ local hsm_root="$mntpt/$tdir"
+ setup_loopdev $SINGLEAGT $loopfile $mntpt 50
copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
setup_pcc_mapping
}
run_test 5 "Mmap & cat a RW-PCC cached file"
-setup_loopdev() {
- local facet=$1
- local file=$2
- local mntpt=$3
- local size=${4:-50}
-
- do_facet $facet mkdir -p $mntpt || error "mkdir -p $hsm_root failed"
- stack_trap "do_facet $facet rm -rf $mntpt" EXIT
- do_facet $facet dd if=/dev/zero of=$file bs=1M count=$size
- stack_trap "do_facet $facet rm -f $file" EXIT
- do_facet $facet mkfs.ext4 $file ||
- error "mkfs.ext4 $file failed"
- do_facet $facet file $file
- do_facet $facet mount -t ext4 -o loop,usrquota,grpquota $file $mntpt ||
- error "mount -o loop,usrquota,grpquota $file $mntpt failed"
- stack_trap "do_facet $facet $UMOUNT $mntpt" EXIT
-}
-
test_6() {
local loopfile="$TMP/$tfile"
local mntpt="/mnt/pcc.$tdir"
error "mmap write data mismatch: $content"
check_lpcc_state $file "readwrite"
- do_facet $SINGLEAGT $LFS pcc detach -k $file ||
+ do_facet $SINGLEAGT $LFS pcc detach $file ||
error "failed to detach file $file"
+ wait_request_state $(path2fid $file) REMOVE SUCCEED
content=$(do_facet $SINGLEAGT $MMAP_CAT $file)
[[ $content == "nmap_write_data" ]] ||
setup_loopdev $SINGLEAGT $loopfile $mntpt 50
copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
- setup_pcc_mapping
+ setup_pcc_mapping $SINGLEAGT \
+ "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0"
echo "QQQQQ" > $file
do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
do_facet $SINGLEAGT $MULTIOP $file OSMWUc &
pid=$!
+ sleep 3
do_facet $SINGLEAGT $LFS pcc detach -k $file ||
error "failed to detach file $file"
run_test 7b "Test the race with concurrent mkwrite and detach"
test_8() {
+ local loopfile="$TMP/$tfile"
+ local mntpt="/mnt/pcc.$tdir"
+ local hsm_root="$mntpt/$tdir"
local file=$DIR/$tfile
+ setup_loopdev $SINGLEAGT $loopfile $mntpt 50
copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
setup_pcc_mapping
local pid
copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
- setup_pcc_mapping
+ setup_pcc_mapping $SINGLEAGT \
+ "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0"
echo -n race_rw_attach_hsmremove > $file
lpcc_path=$(lpcc_fid2path $hsm_root $file)
local myRUNAS="$3"
local file=$DIR/$tdir/$tfile
- setup_pcc_mapping $SINGLEAGT "$rule\ rwid=$HSM_ARCHIVE_NUMBER"
+ setup_pcc_mapping $SINGLEAGT \
+ "$rule\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0"
$LCTL pcc list $MOUNT
do_facet $SINGLEAGT mkdir -p $DIR/$tdir
error "failed to dd write from $file"
check_lpcc_state $file "readwrite"
- do_facet $SINGLEAGT $myRUNAS $LFS pcc detach -k $file ||
+ do_facet $SINGLEAGT $myRUNAS $LFS pcc detach $file ||
error "failed to detach file $file"
+ wait_request_state $(path2fid $file) REMOVE SUCCEED
check_lpcc_state $file "none"
+
+ cleanup_pcc_mapping
}
test_13a() {
copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
setup_pcc_mapping $SINGLEAGT \
- "fname={*.h5\ suffix.*\ Mid*dle}\ rwid=$HSM_ARCHIVE_NUMBER"
+ "fname={*.h5\ suffix.*\ Mid*dle}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0"
$LCTL pcc list $MOUNT
do_facet $SINGLEAGT mkdir -p $DIR/$tdir
test_13c() {
local file
local myRUNAS
+ local loopfile="$TMP/$tfile"
+ local mntpt="/mnt/pcc.$tdir"
+ local hsm_root="$mntpt/$tdir"
! is_project_quota_supported &&
echo "Skip project quota is not supported" && return 0
enable_project_quota
+ setup_loopdev $SINGLEAGT $loopfile $mntpt 50
copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
setup_pcc_mapping $SINGLEAGT \
"projid={100\ 200}\&fname={*.h5},uid={500}\&gid={1000}\ rwid=$HSM_ARCHIVE_NUMBER"
local file=$DIR/$tdir/$tfile
copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
- setup_pcc_mapping
+ setup_pcc_mapping $SINGLEAGT \
+ "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0"
mkdir -p $DIR/$tdir || error "mkdir -p $DIR/$tdir failed"
do_facet $SINGLEAGT "echo -n autodetach_data > $file"
setup_loopdev $SINGLEAGT $loopfile $mntpt 50
copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
- setup_pcc_mapping $SINGLEAGT \
- "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ open_attach=1"
+ setup_pcc_mapping
mkdir $DIR/$tdir || error "mkdir $DIR/$tdir failed"
chmod 777 $DIR/$tdir || error "chmod 777 $DIR/$tdir failed"
setup_loopdev $SINGLEAGT $loopfile $mntpt 50
copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
- setup_pcc_mapping $SINGLEAGT \
- "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ open_attach=1"
+ setup_pcc_mapping
do_facet $SINGLEAGT "echo -n detach_data > $file"
lpcc_path=$(lpcc_fid2path $hsm_root $file)
}
run_test 16 "Test detach with different options"
+test_17() {
+ local agt_host=$(facet_active_host $SINGLEAGT)
+ local loopfile="$TMP/$tfile"
+ local mntpt="/mnt/pcc.$tdir"
+ local hsm_root="$mntpt/$tdir"
+ local file=$DIR/$tfile
+
+ setup_loopdev $SINGLEAGT $loopfile $mntpt 50
+ copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
+ setup_pcc_mapping $SINGLEAGT \
+ "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ open_attach=0\ stat_attach=0"
+
+ do_facet $SINGLEAGT $LCTL pcc list $MOUNT
+
+ do_facet $SINGLEAGT "echo -n layout_refresh_data > $file"
+ do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
+ error "PCC attach $file failed"
+ check_lpcc_state $file "readwrite"
+
+ do_facet $SINGLEAGT $LFS pcc detach -k $file ||
+ error "PCC detach $file failed"
+ check_lpcc_state $file "none"
+
+ # Truncate should attach the file into PCC automatically
+ # as the PCC copy is still valid.
+ echo "Verify auto attach during IO for truncate"
+ do_facet $SINGLEAGT $TRUNCATE $file 4 || error "truncate $file failed"
+ check_lpcc_state $file "readwrite"
+
+ echo "Verify auto attach during IO for read/write"
+ rmultiop_start $agt_host $file O_r || error "open $file failed"
+ sleep 3
+
+ # Revoke the layout lock, the PCC-cached file will be
+ # detached automatically.
+ do_facet $SINGLEAGT $LCTL \
+ set_param ldlm.namespaces.*mdc*.lru_size=clear
+
+ check_lpcc_state $file "none"
+ rmultiop_stop $agt_host || error "close $file failed"
+ sleep 3
+ check_lpcc_state $file "readwrite"
+
+ do_facet $SINGLEAGT $LFS pcc detach -k $file ||
+ error "PCC detach $file failed"
+ check_lpcc_state $file "none"
+}
+run_test 17 "Test auto attach for layout refresh"
+
+test_18() {
+ local agt_host=$(facet_active_host $SINGLEAGT)
+ local loopfile="$TMP/$tfile"
+ local mntpt="/mnt/pcc.$tdir"
+ local hsm_root="$mntpt/$tdir"
+ local file=$DIR/$tfile
+ local oldmd5
+ local newmd5
+
+ setup_loopdev $SINGLEAGT $loopfile $mntpt 50
+ copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
+ setup_pcc_mapping $SINGLEAGT \
+ "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER"
+
+ do_facet $SINGLEAGT $LCTL pcc list $MOUNT
+ do_facet $SINGLEAGT dd if=/dev/urandom of=$file bs=1M count=4 ||
+ error "failed to write $file"
+ do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
+ error "failed to attach $file"
+ do_facet $SINGLEAGT $LFS pcc state $file
+ check_lpcc_state $file "readwrite"
+ do_facet $SINGLEAGT $LFS pcc detach --keep $file ||
+ error "failed to detach $file"
+ do_facet $SINGLEAGT $LFS pcc state $file
+ $CHECKSTAT -s 4194304 $file
+ dd if=/dev/zero of=$DIR2/$tfile seek=1k bs=1k count=1 ||
+ error "failed to write $DIR2/$tfile"
+ oldmd5=$(md5sum $DIR2/$tfile | awk '{print $1}')
+ $CHECKSTAT -s 1049600 $DIR2/$tfile || error "$DIR2/$tfile size wrong"
+
+ local lpcc_path=$(lpcc_fid2path $hsm_root $file)
+
+ do_facet $SINGLEAGT $LFS pcc state $file
+ check_file_size $SINGLEAGT $lpcc_path 4194304
+ do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
+ error "failed to attach $file"
+ check_lpcc_sizes $SINGLEAGT $lpcc_path $file 1049600
+ newmd5=$(do_facet $SINGLEAGT md5sum $file | awk '{print $1}')
+ [ "$oldmd5" == "$newmd5" ] || error "md5sum differ: $oldmd5 != $newmd5"
+ do_facet $SINGLEAGT $LFS pcc detach $file ||
+ error "failed to detach $file"
+}
+run_test 18 "Verify size correctness after re-attach the file"
+
+test_19() {
+ local agt_host=$(facet_active_host $SINGLEAGT)
+ local loopfile="$TMP/$tfile"
+ local mntpt="/mnt/pcc.$tdir"
+ local hsm_root="$mntpt/$tdir"
+ local file=$DIR/$tfile
+
+ setup_loopdev $SINGLEAGT $loopfile $mntpt 50
+ copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
+ setup_pcc_mapping $SINGLEAGT \
+ "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0"
+
+ do_facet $SINGLEAGT "echo -n QQQQQ > $file" || error "echo $file failed"
+ lpcc_path=$(lpcc_fid2path $hsm_root $file)
+ do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
+ error "Failed to attach $file"
+ check_lpcc_state $file "readwrite"
+ check_lpcc_sizes $SINGLEAGT $file $lpcc_path 5
+ do_facet $SINGLEAGT $LFS pcc detach --keep $file ||
+ error "Failed to detach $file"
+ do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
+ error "Failed to attach $file"
+ check_lpcc_sizes $SINGLEAGT $file $lpcc_path 5
+ do_facet $SINGLEAGT $LFS pcc detach --keep $file ||
+ error "Failed to detach $file"
+}
+run_test 19 "Verify the file re-attach works as expected"
+
+test_20() {
+ local agt_host=$(facet_active_host $SINGLEAGT)
+ local loopfile="$TMP/$tfile"
+ local mntpt="/mnt/pcc.$tdir"
+ local hsm_root="$mntpt/$tdir"
+ local file=$DIR/$tfile
+
+ setup_loopdev $SINGLEAGT $loopfile $mntpt 50
+ copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
+ setup_pcc_mapping $SINGLEAGT \
+ "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER"
+
+ do_facet $SINGLEAGT "echo -n QQQQQ > $file" ||
+ error "echo $file failed"
+ do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
+ error "Failed to attach $file"
+ do_facet $SINGLEAGT "echo 3 > /proc/sys/vm/drop_caches"
+ check_lpcc_state $file "readwrite"
+ do_facet $SINGLEAGT "echo 3 > /proc/sys/vm/drop_caches"
+ do_facet $SINGLEAGT "echo 3 > /proc/sys/vm/drop_caches"
+ check_lpcc_state $file "readwrite"
+ do_facet $SINGLEAGT $LFS pcc detach $file ||
+ error "Failed to detach $file"
+}
+run_test 20 "Auto attach works after the inode was once evicted from cache"
+
complete $SECONDS
check_and_cleanup_lustre
exit_status