+test_47() {
+ [ $OSTCOUNT -lt 3 ] && skip "needs >= 3 OSTs" && return
+
+ local file=$DIR/$tdir/$tfile
+ local ids
+ local ost
+ local osts
+
+ test_mkdir $DIR/$tdir
+
+ # test case 1:
+ rm -f $file
+ # mirror1: [comp0]ost0, [comp1]ost1 and ost2
+ # mirror2: [comp2] , [comp3] should not use ost1 or ost2
+ $LFS mirror create -N -E2m -c1 -o0 --flags=prefer -Eeof -c2 -o1,2 \
+ -N -E2m -c1 -Eeof -c1 $file || error "create FLR $file failed"
+ ids=($($LFS getstripe $file | awk '/lcme_id/{print $2}' | tr '\n' ' '))
+
+ dd if=/dev/zero of=$file bs=1M count=3 || error "dd $file failed"
+ $LFS mirror resync $file || error "resync $file failed"
+
+ ost=$($LFS getstripe -I${ids[2]} $file | awk '/l_ost_idx/{print $5}')
+ if [[ x$ost == "x0," ]]; then
+ $LFS getstripe $file
+ error "component ${ids[2]} objects allocated on $ost " \
+ "shouldn't on OST0"
+ fi
+
+ ost=$($LFS getstripe -I${ids[3]} $file | awk '/l_ost_idx/{print $5}')
+ if [[ x$ost == "x1," || x$ost == "x2," ]]; then
+ $LFS getstripe $file
+ error "component ${ids[3]} objects allocated on $ost " \
+ "shouldn't on OST1 or on OST2"
+ fi
+
+ ## test case 2:
+ rm -f $file
+ # mirror1: [comp0] [comp1]
+ # mirror2: [comp2] [comp3]
+ # mirror3: [comp4] [comp5]
+ # mirror4: [comp6] [comp7]
+ $LFS mirror create -N4 -E1m -c1 -Eeof -c1 $file ||
+ error "create FLR $file failed"
+ ids=($($LFS getstripe $file | awk '/lcme_id/{print $2}' | tr '\n' ' '))
+
+ dd if=/dev/zero of=$file bs=1M count=3 || error "dd $file failed"
+ $LFS mirror resync $file || error "resync $file failed"
+
+ for ((i = 0; i < 6; i++)); do
+ osts[$i]=$($LFS getstripe -I${ids[$i]} $file |
+ awk '/l_ost_idx/{print $5}')
+ done
+ # comp[0],comp[2],comp[4] should use different osts
+ if [[ ${osts[0]} == ${osts[2]} || ${osts[0]} == ${osts[4]} ||
+ ${osts[2]} == ${osts[4]} ]]; then
+ $LFS getstripe $file
+ error "component ${ids[0]}, ${ids[2]}, ${ids[4]} have objects "\
+ "allocated on duplicated OSTs"
+ fi
+ # comp[1],comp[3],comp[5] should use different osts
+ if [[ ${osts[1]} == ${osts[3]} || ${osts[1]} == ${osts[5]} ||
+ ${osts[3]} == ${osts[5]} ]]; then
+ $LFS getstripe $file
+ error "component ${ids[1]}, ${ids[3]}, ${ids[5]} have objects "\
+ "allocated on duplicated OSTs"
+ fi
+
+ return 0
+}
+run_test 47 "Verify mirror obj alloc"
+
+test_48() {
+ local tf=$DIR/$tfile
+
+ rm -f $tf
+ echo " ** create 2 mirrors FLR file $tf"
+ $LFS mirror create -N -E2M -Eeof --flags prefer \
+ -N -E1M -Eeof $tf ||
+ error "create FLR file $tf failed"
+
+ echo " ** write it"
+ dd if=/dev/urandom of=$tf bs=1M count=3 || error "write $tf failed"
+ verify_flr_state $tf "wp"
+
+ local sum0=$(md5sum < $tf)
+
+ echo " ** resync the file"
+ $LFS mirror resync $tf
+
+ echo " ** snapshot mirror 2"
+ $LFS setstripe --comp-set -I 0x20003 --comp-flags=nosync $tf
+
+ echo " ** write it again"
+ dd if=/dev/urandom of=$tf bs=1M count=3 || error "write $tf failed"
+ echo " ** resync it again"
+ $LFS mirror resync $tf
+
+ verify_flr_state $tf "wp"
+ verify_comp_attr lcme_flags $tf 0x20003 nosync,stale
+
+ local sum1=$($LFS mirror dump -N1 $tf | md5sum)
+ local sum2=$($LFS mirror dump -N2 $tf | md5sum)
+
+ echo " ** verify mirror 2 doesn't change"
+ echo "original checksum: $sum0"
+ echo "mirror 1 checksum: $sum1"
+ echo "mirror 2 checksum: $sum2"
+ [[ $sum0 = $sum2 ]] ||
+ error "original checksum: $sum0, mirror 2 checksum: $sum2"
+ echo " ** mirror 2 stripe info"
+ $LFS getstripe -v --mirror-index=2 $tf
+
+ echo " ** resync mirror 2"
+ $LFS mirror resync --only 2 $tf
+
+ verify_flr_state $tf "ro"
+ verify_comp_attr lcme_flags $tf 0x20003 nosync,^stale
+
+ sum1=$($LFS mirror dump -N1 $tf | md5sum)
+ sum2=$($LFS mirror dump -N2 $tf | md5sum)
+
+ echo " ** verify mirror 2 resync-ed"
+ echo "original checksum: $sum0"
+ echo "mirror 1 checksum: $sum1"
+ echo "mirror 2 checksum: $sum2"
+ [[ $sum1 = $sum2 ]] ||
+ error "mirror 1 checksum: $sum1, mirror 2 checksum: $sum2"
+ echo " ** mirror 2 stripe info"
+ $LFS getstripe -v --mirror-index=2 $tf
+}
+run_test 48 "Verify snapshot mirror"
+