Whamcloud - gitweb
LU-13535 lfsck: fix possible PFL layout corruption
[fs/lustre-release.git] / lustre / tests / sanity-pcc.sh
1 #!/bin/bash
2 #
3 # Run select tests by setting ONLY, or as arguments to the script.
4 # Skip specific tests by setting EXCEPT.
5 #
6 # exit on error
7 set -e
8 set +o monitor
9
10 SRCDIR=$(dirname $0)
11 export PATH=$PWD/$SRCDIR:$SRCDIR:$PWD/$SRCDIR/utils:$PATH:/sbin:/usr/sbin
12
13 ONLY=${ONLY:-"$*"}
14 # bug number for skipped test:
15 ALWAYS_EXCEPT=""
16 # UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
17
18 ENABLE_PROJECT_QUOTAS=${ENABLE_PROJECT_QUOTAS:-true}
19
20 LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)}
21
22 . $LUSTRE/tests/test-framework.sh
23 init_test_env $@
24 . ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh}
25 init_logging
26
27 MULTIOP=${MULTIOP:-multiop}
28 OPENFILE=${OPENFILE:-openfile}
29 MMAP_CAT=${MMAP_CAT:-mmap_cat}
30 MOUNT_2=${MOUNT_2:-"yes"}
31 FAIL_ON_ERROR=false
32
33 # script only handles up to 10 MDTs (because of MDT_PREFIX)
34 [ $MDSCOUNT -gt 9 ] &&
35         error "script cannot handle more than 9 MDTs, please fix" && exit
36
37 check_and_setup_lustre
38
39 if [[ "$MDS1_VERSION" -lt $(version_code 2.12.52) ]]; then
40         skip "Need MDS version at least 2.12.52"
41 fi
42
43 # $RUNAS_ID may get set incorrectly somewhere else
44 if [[ $UID -eq 0 && $RUNAS_ID -eq 0 ]]; then
45         skip_env "\$RUNAS_ID set to 0, but \$UID is also 0!" && exit
46 fi
47 check_runas_id $RUNAS_ID $RUNAS_GID $RUNAS
48 if getent group nobody; then
49         GROUP=nobody
50 elif getent group nogroup; then
51         GROUP=nogroup
52 else
53         error "No generic nobody group"
54 fi
55
56 build_test_filter
57
58 # if there is no CLIENT1 defined, some tests can be ran on localhost
59 CLIENT1=${CLIENT1:-$HOSTNAME}
60 # if CLIENT2 doesn't exist then use CLIENT1 instead
61 # All tests should use CLIENT2 with MOUNT2 only therefore it will work if
62 # $CLIENT2 == CLIENT1
63 # Exception is the test which need two separate nodes
64 CLIENT2=${CLIENT2:-$CLIENT1}
65
66 check_file_size()
67 {
68         local client="$1"
69         local fpath="$2"
70         local expected_size="$3"
71
72         size=$(do_facet $client stat "--printf=%s" $fpath)
73         [[ $size == "$expected_size" ]] || error \
74                 "expected $fpath size: $expected_size got: $size"
75 }
76
77 check_lpcc_sizes()
78 {
79         local client="$1"
80         local lpcc_fpath="$2"
81         local lustre_fpath="$3"
82         local expected_size="$4"
83
84         check_file_size $client $lpcc_fpath $expected_size
85         check_file_size $client $lustre_fpath $expected_size
86 }
87
88 check_file_data()
89 {
90         local client="$1"
91         local path="$2"
92         local expected_data="$3"
93
94         path_data=$(do_facet $client cat $path)
95         [[ "x$path_data" == "x$expected_data" ]] || error \
96                 "expected $path: $expected_data, got: $path_data"
97 }
98
99 check_lpcc_data()
100 {
101         local client="$1"
102         local lpcc_fpath="$2"
103         local lustre_fpath="$3"
104         local expected_data="$4"
105
106         check_file_data  "$client" "$lpcc_fpath" "$expected_data"
107         check_file_data  "$client" "$lustre_fpath" "$expected_data"
108 }
109
110 lpcc_fid2path()
111 {
112         local hsm_root="$1"
113         local lustre_path="$2"
114         local fid=$(path2fid $lustre_path)
115
116         local -a f_seq
117         local -a f_oid
118         local -a f_ver
119
120         f_seq=$(echo $fid | awk -F ':' '{print $1}')
121         f_oid=$(echo $fid | awk -F ':' '{print $2}')
122         f_ver=$(echo $fid | awk -F ':' '{print $3}')
123
124         printf "%s/%04x/%04x/%04x/%04x/%04x/%04x/%s" \
125                 $hsm_root $(($f_oid & 0xFFFF)) \
126                 $(($f_oid >> 16 & 0xFFFF)) \
127                 $(($f_seq & 0xFFFF)) \
128                 $(($f_seq >> 16 & 0xFFFF)) \
129                 $(($f_seq >> 32 & 0xFFFF)) \
130                 $(($f_seq >> 48 & 0xFFFF)) $fid
131 }
132
133 check_lpcc_state()
134 {
135         local lustre_path="$1"
136         local expected_state="$2"
137         local facet=${3:-$SINGLEAGT}
138         local myRUNAS="$4"
139         local state=$(do_facet $facet $myRUNAS $LFS pcc state $lustre_path |
140                         awk -F 'type: ' '{print $2}' | awk -F ',' '{print $1}')
141
142         [[ "x$state" == "x$expected_state" ]] || error \
143                 "$lustre_path expected pcc state: $expected_state, but got: $state"
144 }
145
146 # initiate variables
147 init_agt_vars
148
149 # populate MDT device array
150 get_mdt_devices
151
152 # cleanup from previous bad setup
153 kill_copytools
154
155 # for recovery tests, coordinator needs to be started at mount
156 # so force it
157 # the lustre conf must be without hsm on (like for sanity.sh)
158 echo "Set HSM on and start"
159 cdt_set_mount_state enabled
160 cdt_check_state enabled
161
162 echo "Set sanity-hsm HSM policy"
163 cdt_set_sanity_policy
164
165 # finished requests are quickly removed from list
166 set_hsm_param grace_delay 10
167
168 cleanup_pcc_mapping() {
169         local facet=${1:-$SINGLEAGT}
170
171         do_facet $facet $LCTL pcc clear $MOUNT
172 }
173
174 setup_pcc_mapping() {
175         local facet=${1:-$SINGLEAGT}
176         local hsm_root=${hsm_root:-$(hsm_root "$facet")}
177         local param="$2"
178
179         [ -z "$param" ] && param="projid={100}\ rwid=$HSM_ARCHIVE_NUMBER"
180         stack_trap "cleanup_pcc_mapping $facet" EXIT
181         do_facet $facet $LCTL pcc add $MOUNT $hsm_root -p $param
182 }
183
184 setup_loopdev() {
185         local facet=$1
186         local file=$2
187         local mntpt=$3
188         local size=${4:-50}
189
190         do_facet $facet mkdir -p $mntpt || error "mkdir -p $hsm_root failed"
191         stack_trap "do_facet $facet rm -rf $mntpt" EXIT
192         do_facet $facet dd if=/dev/zero of=$file bs=1M count=$size
193         stack_trap "do_facet $facet rm -f $file" EXIT
194         do_facet $facet mkfs.ext4 $file ||
195                 error "mkfs.ext4 $file failed"
196         do_facet $facet file $file
197         do_facet $facet mount -t ext4 -o loop,usrquota,grpquota $file $mntpt ||
198                 error "mount -o loop,usrquota,grpquota $file $mntpt failed"
199         stack_trap "do_facet $facet $UMOUNT $mntpt" EXIT
200 }
201
202 lpcc_rw_test() {
203         local restore="$1"
204         local project="$2"
205         local project_id=100
206         local agt_facet=$SINGLEAGT
207         local loopfile="$TMP/$tfile"
208         local mntpt="/mnt/pcc.$tdir"
209         local hsm_root="$mntpt/$tdir"
210         local file=$DIR/$tdir/$tfile
211         local -a state
212         local -a lpcc_path
213         local -a size
214
215         $project && enable_project_quota
216
217         do_facet $SINGLEAGT rm -rf $hsm_root
218         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
219         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
220
221         is_project_quota_supported || project=false
222
223         do_facet $SINGLEAGT mkdir -p $DIR/$tdir
224         setup_pcc_mapping
225         $project && lfs project -sp $project_id $DIR/$tdir
226
227         do_facet $SINGLEAGT "echo -n attach_origin > $file"
228         if ! $project; then
229                 check_lpcc_state $file "none"
230                 do_facet $SINGLEAGT $LFS pcc attach -i \
231                         $HSM_ARCHIVE_NUMBER $file ||
232                         error "pcc attach $file failed"
233         fi
234
235         check_lpcc_state $file "readwrite"
236         # HSM released exists archived status
237         check_hsm_flags $file "0x0000000d"
238         lpcc_path=$(lpcc_fid2path $hsm_root $file)
239         check_lpcc_data $SINGLEAGT $lpcc_path $file "attach_origin"
240
241         do_facet $SINGLEAGT dd if=/dev/zero of=$file bs=7654321 count=1
242         check_lpcc_sizes $SINGLEAGT $lpcc_path $file 7654321
243
244         do_facet $SINGLEAGT $TRUNCATE $file 1234567 ||
245                 error "truncate failed"
246         check_lpcc_sizes $SINGLEAGT $lpcc_path $file 1234567
247         check_lpcc_state $file "readwrite"
248
249         do_facet $SINGLEAGT "echo -n file_data > $file"
250         check_lpcc_state $file "readwrite"
251         # HSM released exists archived status
252         check_hsm_flags $file "0x0000000d"
253         check_lpcc_data $SINGLEAGT $lpcc_path $file "file_data"
254
255         echo "Restore testing..."
256         if [ $CLIENTCOUNT -lt 2 -o $restore ]; then
257                 $LFS hsm_restore $file || error \
258                         "failed to restore $file"
259                 wait_request_state $(path2fid $file) RESTORE SUCCEED
260         else
261                 path_data=$(do_node $CLIENT2 cat $file)
262                 [[ "x$path_data" == "xfile_data" ]] || error \
263                         "expected file_data, got: $path_data"
264         fi
265
266         check_lpcc_state $file "none"
267         # HSM exists archived status
268         check_hsm_flags $file "0x00000009"
269
270         echo -n "new_data" > $file
271         check_lpcc_state $file "none"
272         # HSM exists dirty archived status
273         check_hsm_flags $file "0x0000000b"
274         check_file_data $SINGLEAGT $file "new_data"
275
276         echo "Attach and detach testing"
277         rm -f $file
278         do_facet $SINGLEAGT "echo -n new_data2 > $file"
279         if ! $project; then
280                 check_lpcc_state $file "none"
281                 do_facet $SINGLEAGT $LFS pcc attach -i \
282                         $HSM_ARCHIVE_NUMBER $file ||
283                         error "PCC attach $file failed"
284         fi
285         check_lpcc_state $file "readwrite"
286         # HSM released exists archived status
287         check_hsm_flags $file "0x0000000d"
288         do_facet $SINGLEAGT "echo -n attach_detach > $file"
289         echo "Start to detach the $file"
290         do_facet $SINGLEAGT $LFS pcc detach $file ||
291                 error "PCC detach $file failed"
292         wait_request_state $(path2fid $file) REMOVE SUCCEED
293
294         check_lpcc_state $file "none"
295         # The file is removed from PCC
296         check_hsm_flags $file "0x00000000"
297         check_file_data $SINGLEAGT $file "attach_detach"
298 }
299
300 test_1a() {
301         lpcc_rw_test true false
302 }
303 run_test 1a "Test manual lfs pcc attach with manual HSM restore"
304
305 test_1b() {
306         lpcc_rw_test false false
307 }
308 run_test 1b "Test manual lfs pcc attach with restore on remote access"
309
310 test_1c() {
311         lpcc_rw_test true true
312 }
313 run_test 1c "Test automated attach using Project ID with manual HSM restore"
314
315 test_1d() {
316         lpcc_rw_test false true
317 }
318 run_test 1d "Test Project ID with remote access"
319
320 test_1e() {
321         local file=$DIR/$tdir/$tfile
322         local hsm_root=$(hsm_root)
323         local -a lpcc_path
324
325         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
326         setup_pcc_mapping $SINGLEAGT \
327                 "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0"
328         $LCTL pcc list $MOUNT
329         mkdir $DIR/$tdir || error "mkdir $DIR/$tdir failed"
330         chmod 777 $DIR/$tdir || error "chmod 777 $DIR/$tdir failed"
331
332         do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$file bs=1024 count=1 ||
333                 error "failed to dd write to $file"
334         do_facet $SINGLEAGT $RUNAS $LFS pcc attach -i $HSM_ARCHIVE_NUMBER \
335                 $file || error "failed to attach file $file"
336         check_lpcc_state $file "readwrite"
337         do_facet $SINGLEAGT $RUNAS dd if=$file of=/dev/null bs=1024 count=1 ||
338                 error "failed to dd read from $file"
339         do_facet $SINGLEAGT $RUNAS $TRUNCATE $file 256 ||
340                 error "failed to truncate $file"
341         do_facet $SINGLEAGT $RUNAS $TRUNCATE $file 2048 ||
342                 error "failed to truncate $file"
343         do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$file bs=1024 count=1 ||
344                 error "failed to dd write to $file"
345         check_lpcc_state $file "readwrite"
346
347         do_facet $SINGLEAGT $RUNAS $LFS pcc detach -k $file ||
348                 error "failed to detach file $file"
349         check_lpcc_state $file "none"
350
351         # non-root user is forbidden to access PCC file directly
352         lpcc_path=$(lpcc_fid2path $hsm_root $file)
353         do_facet $SINGLEAGT $RUNAS touch $lpcc_path &&
354                 error "non-root user can touch access PCC file $lpcc_path"
355         do_facet $SINGLEAGT $RUNAS dd if=$lpcc_path of=/dev/null bs=1024 \
356                 count=1 && error "non-root user can read PCC file $lpcc_path"
357         do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$lpcc_path bs=1024 \
358                 count=1 && error "non-root user can write PCC file $lpcc_path"
359
360         local perm=$(do_facet $SINGLEAGT stat -c %a $lpcc_path)
361
362         [[ $perm == "0" ]] || error "PCC file permission ($perm) is not zero"
363
364         do_facet $SINGLEAGT $RUNAS $LFS pcc attach -i $HSM_ARCHIVE_NUMBER \
365                 $file || error "failed to attach file $file"
366         check_lpcc_state $file "readwrite"
367
368         do_facet $SINGLEAGT $RUNAS $LFS pcc detach $file ||
369                 error "failed to detach file $file"
370         check_lpcc_state $file "none"
371         wait_request_state $(path2fid $file) REMOVE SUCCEED
372 }
373 run_test 1e "Test RW-PCC with non-root user"
374
375 test_1f() {
376         local project_id=100
377         local agt_facet=$SINGLEAGT
378         local loopfile="$TMP/$tfile"
379         local mntpt="/mnt/pcc.$tdir"
380         local hsm_root="$mntpt/$tdir"
381         local file=$DIR/$tdir/$tfile
382
383         ! is_project_quota_supported &&
384                 skip "project quota is not supported"
385
386         enable_project_quota
387         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
388         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
389         setup_pcc_mapping $SINGLEAGT \
390                 "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ open_attach=0\ stat_attach=0"
391
392         do_facet $SINGLEAGT mkdir -p $DIR/$tdir
393         chmod 777 $DIR/$tdir || error "chmod 0777 $DIR/$tdir failed"
394         $LFS project -sp $project_id $DIR/$tdir ||
395                 error "failed to set project for $DIR/$tdir"
396
397         do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$file bs=1024 count=1 ||
398                 error "failed to dd write to $file"
399
400         check_lpcc_state $file "readwrite"
401         do_facet $SINGLEAGT $RUNAS dd if=$file of=/dev/null bs=1024 count=1 ||
402                 error "failed to dd read from $file"
403         do_facet $SINGLEAGT $RUNAS $TRUNCATE $file 256 ||
404                 error "failed to truncate $file"
405         do_facet $SINGLEAGT $RUNAS $TRUNCATE $file 2048 ||
406                 error "failed to truncate $file"
407         do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$file bs=256 count=1 ||
408                 error "failed to dd write from $file"
409         check_lpcc_state $file "readwrite"
410
411         # non-root user is forbidden to access PCC file directly
412         lpcc_path=$(lpcc_fid2path $hsm_root $file)
413         do_facet $SINGLEAGT $RUNAS touch $lpcc_path &&
414                 error "non-root user can touch access PCC file $lpcc_path"
415         do_facet $SINGLEAGT $RUNAS dd if=$lpcc_path of=/dev/null bs=1024 \
416                 count=1 && error "non-root user can read PCC file $lpcc_path"
417         do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$lpcc_path bs=1024 \
418                 count=1 && error "non-root user can write PCC file $lpcc_path"
419
420         do_facet $SINGLEAGT $RUNAS $LFS pcc detach $file ||
421                 error "failed to detach file $file"
422         wait_request_state $(path2fid $file) REMOVE SUCCEED
423         check_lpcc_state $file "none"
424 }
425 run_test 1f "Test auto RW-PCC cache with non-root user"
426
427 test_1g() {
428         local loopfile="$TMP/$tfile"
429         local mntpt="/mnt/pcc.$tdir"
430         local hsm_root="$mntpt/$tdir"
431         local file=$DIR/$tfile
432
433         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
434         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
435         setup_pcc_mapping
436
437         dd if=/dev/zero of=$file bs=1024 count=1 ||
438                 error "failed to dd write to $file"
439         do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$file bs=1024 count=1 &&
440                 error "non-root user can dd write to $file"
441         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
442                 error "failed to attach file $file"
443         check_lpcc_state $file "readwrite"
444         do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$file bs=1024 count=1 &&
445                 error "non-root user can dd write to $file"
446         chmod 777 $file || error "chmod 777 $file failed"
447         do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$file bs=1024 count=1 ||
448                 error "non-root user cannot write $file with permission (777)"
449
450         do_facet $SINGLEAGT $RUNAS $LFS pcc detach $file &&
451                 error "non-root user or non owner can detach $file"
452         chown $RUNAS_ID $file || error "chown $RUNAS_ID $file failed"
453         do_facet $SINGLEAGT $RUNAS $LFS pcc detach $file ||
454                 error "failed to detach file $file"
455         check_lpcc_state $file "none"
456         wait_request_state $(path2fid $file) REMOVE SUCCEED
457         do_facet $SINGLEAGT $RUNAS dd if=$file of=/dev/null bs=1024 count=1 ||
458                 error "non-root user cannot read to $file with permisson (777)"
459 }
460 run_test 1g "General permission test for RW-PCC"
461
462 #
463 # When a process created a LPCC file and holding the open,
464 # another process on the same client should be able to open the file.
465 #
466 test_2a() {
467         local project_id=100
468         local agt_facet=$SINGLEAGT
469         local loopfile="$TMP/$tfile"
470         local mntpt="/mnt/pcc.$tdir"
471         local hsm_root="$mntpt/$tdir"
472         local agt_host=$(facet_active_host $SINGLEAGT)
473
474         ! is_project_quota_supported &&
475                 skip "project quota is not supported" && return
476
477         enable_project_quota
478         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
479         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
480         setup_pcc_mapping
481         file=$DIR/$tdir/multiop
482         mkdir -p $DIR/$tdir
483         rm -f $file
484
485         do_facet $SINGLEAGT $LFS project -sp $project_id $DIR/$tdir ||
486                 error "failed to set project quota"
487         rmultiop_start $agt_host $file O_c || error "open $file failed"
488         # HSM released exists archived status
489         check_hsm_flags $file "0x0000000d"
490         do_facet $SINGLEAGT "echo -n multiopen_data > $file" ||
491                 error "failed to echo multiopen_data to $file"
492
493         lpcc_path=$(lpcc_fid2path $hsm_root $file)
494         do_facet $SINGLEAGT ls -l $lpcc_path ||
495                 error "failed to ls $lpcc_path"
496         check_lpcc_data $SINGLEAGT $lpcc_path $file "multiopen_data"
497         # HSM released exists archived status
498         check_hsm_flags $file "0x0000000d"
499
500         do_facet $SINGLEAGT $LFS pcc detach $file ||
501                 error "failed to detach $file"
502         rmultiop_stop $agt_host || error "close $file failed"
503 }
504 run_test 2a "Test multi open when creating"
505
506 get_remote_client() {
507         current_id=$(do_facet $SINGLEAGT hostname)
508         for client in ${CLIENTS//,/ }
509         do
510                 r_id=$(do_node $client hostname)
511                 if [ $r_id != $current_id ]; then
512                         echo $client
513                         return
514                 fi
515         done
516 }
517
518 #
519 # When a process created a LPCC file and holding the open, another
520 # process on the different client should be able to open the file
521 # and perform IO on the file.
522 #
523 test_2b() {
524         local agt_facet=$SINGLEAGT
525         local agt_host=$(facet_active_host $SINGLEAGT)
526         local loopfile="$TMP/$tfile"
527         local mntpt="/mnt/pcc.$tdir"
528         local hsm_root="$mntpt/$tdir"
529
530         needclients 2 || return 0
531
532         remote_client=$(get_remote_client)
533
534         enable_project_quota
535         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
536         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
537         setup_pcc_mapping
538         file=$DIR/$tdir/multiop
539         mkdir -p $DIR/$tdir
540         rm -f $file
541
542         do_facet $SINGLEAGT "echo -n file_data > $file"
543         do_facet $SINGLEAGT lfs pcc attach -i $HSM_ARCHIVE_NUMBER \
544                 $file || error "PCC attach $file failed"
545         check_lpcc_state $file "readwrite"
546
547         rmultiop_start $agt_host $file O_c || error "open $file failed"
548
549         do_node $remote_client "echo -n multiopen_data > $file"
550
551         # PCC cached file should be automatically detached
552         check_lpcc_state $file "none"
553
554         check_file_data $SINGLEAGT $file "multiopen_data"
555         rmultiop_stop $agt_host || error "close $file failed"
556         check_file_data $SINGLEAGT $file "multiopen_data"
557
558         do_node $remote_client cat $file || error \
559                 "cat $file on remote client failed"
560         do_node $remote_client echo -n "multiopen_data" > $file \
561                 || error "write $file on remote client failed"
562 }
563 run_test 2b "Test multi remote open when creating"
564
565 test_2c() {
566         local agt_host=$(facet_active_host $SINGLEAGT)
567         local loopfile="$TMP/$tfile"
568         local mntpt="/mnt/pcc.$tdir"
569         local hsm_root="$mntpt/$tdir"
570         local file=$DIR/$tdir/$tfile
571         local file2=$DIR2/$tdir/$tfile
572
573         enable_project_quota
574         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
575         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
576         setup_pcc_mapping
577         mkdir -p $DIR/$tdir
578         rm -f $file
579
580         do_facet $SINGLEAGT "echo -n file_data > $file"
581         do_facet $SINGLEAGT lfs pcc attach -i $HSM_ARCHIVE_NUMBER \
582                 $file || error "PCC attach $file failed"
583         check_lpcc_state $file "readwrite"
584
585         rmultiop_start $agt_host $file O_c || error "open $file failed"
586
587         echo -n multiopen_data > $file2
588
589         # PCC cached file should be automatically detached
590         check_lpcc_state $file "none"
591
592         check_file_data $SINGLEAGT $file "multiopen_data"
593         rmultiop_stop $agt_host || error "close $file failed"
594         check_file_data $SINGLEAGT $file "multiopen_data"
595
596         cat $file2 || error "cat $file on mount $MOUNT2 failed"
597         echo -n "multiopen_data" > $file2 ||
598                 error "write $file on mount $MOUNT2 failed"
599 }
600 run_test 2c "Test multi open on different mount points when creating"
601
602 test_3a() {
603         local file=$DIR/$tdir/$tfile
604
605         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
606         setup_pcc_mapping $SINGLEAGT \
607                 "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0"
608
609         mkdir -p $DIR/$tdir || error "mkdir $DIR/$tdir failed"
610         dd if=/dev/zero of=$file bs=1024 count=1 ||
611                 error "failed to dd write to $file"
612
613         echo "Start to attach/detach the file: $file"
614         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
615                 error "failed to attach file $file"
616         check_lpcc_state $file "readwrite"
617         do_facet $SINGLEAGT $LFS pcc detach -k $file ||
618                 error "failed to detach file $file"
619         check_lpcc_state $file "none"
620
621         echo "Repeat to attach/detach the same file: $file"
622         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
623                 error "failed to attach file $file"
624         check_lpcc_state $file "readwrite"
625         do_facet $SINGLEAGT $LFS pcc detach -k $file ||
626                 error "failed to detach file $file"
627         check_lpcc_state $file "none"
628 }
629 run_test 3a "Repeat attach/detach operations"
630
631 test_3b() {
632         local n
633         local file=$DIR/$tdir/$tfile
634
635         needclients 3 || return 0
636
637         # Start all of the copytools and setup PCC
638         for n in $(seq $AGTCOUNT); do
639                 copytool setup -f agt$n -a $n -m $MOUNT
640                 setup_pcc_mapping agt$n "projid={100}\ rwid=$n\ auto_attach=0"
641         done
642
643         mkdir -p $DIR/$tdir || error "mkdir $DIR/$tdir failed"
644         dd if=/dev/zero of=$file bs=1024 count=1 ||
645                 error "failed to dd write to $file"
646
647         echo "Start to attach/detach $file on $agt1_HOST"
648         do_facet agt1 $LFS pcc attach -i 1 $file ||
649                 error "failed to attach file $file"
650         check_lpcc_state $file "readwrite" agt1
651         do_facet agt1 $LFS pcc detach -k $file ||
652                 error "failed to detach file $file"
653         check_lpcc_state $file "none" agt1
654
655         echo "Repeat to attach/detach $file on $agt2_HOST"
656         do_facet agt2 $LFS pcc attach -i 2 $file ||
657                 error "failed to attach file $file"
658         check_lpcc_state $file "readwrite" agt2
659         do_facet agt2 $LFS pcc detach -k $file ||
660                 error "failed to detach file $file"
661         check_lpcc_state $file "none" agt2
662
663         echo "Try attach on two agents"
664         do_facet agt1 $LFS pcc attach -i 1 $file ||
665                 error "failed to attach file $file"
666         check_lpcc_state $file "readwrite" agt1
667         do_facet agt2 $LFS pcc attach -i 2 $file ||
668                 error "failed to attach file $file"
669         check_lpcc_state $file "readwrite" agt2
670         # The later attach PCC agent should succeed,
671         # the former agent should be detached automatically.
672         check_lpcc_state $file "none" agt1
673         do_facet agt2 $LFS pcc detach -k $file ||
674                 error "failed to detach file $file"
675         check_lpcc_state $file "none" agt2
676 }
677 run_test 3b "Repeat attach/detach operations on multiple clients"
678
679 test_4() {
680         local project_id=100
681         local loopfile="$TMP/$tfile"
682         local mntpt="/mnt/pcc.$tdir"
683         local hsm_root="$mntpt/$tdir"
684
685         ! is_project_quota_supported &&
686                 skip "project quota is not supported" && return
687
688         enable_project_quota
689         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
690         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
691         setup_pcc_mapping
692
693         mkdir -p $DIR/$tdir || error "mkdir $DIR/$tdir failed"
694         lfs project -sp $project_id $DIR/$tdir ||
695                 error "lfs project -sp $project_id $DIR/$tdir failed"
696
697         # mmap_sanity tst7 failed on the local ext4 filesystem.
698         # It seems that Lustre filesystem does special process for tst 7.
699         # Thus, we exclude tst7 from the PCC testing.
700         # There is a mmap problem for PCC when multiple clients read/write
701         # on a shared mmapped file. Thus, we exclude mmap_sanity tst6 from
702         # the PCC tesing.
703         $LUSTRE/tests/mmap_sanity -d $DIR/$tdir -m $DIR2/$tdir -e 6 -e 7 ||
704                 error "mmap_sanity test failed"
705         sync; sleep 1; sync
706
707         rm -rf $DIR/$tdir || error "failed to remove $DIR/$tdir"
708 }
709 run_test 4 "Auto cache test for mmap"
710
711 test_5() {
712         local file=$DIR/$tfile
713         local loopfile="$TMP/$tfile"
714         local mntpt="/mnt/pcc.$tdir"
715         local hsm_root="$mntpt/$tdir"
716
717         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
718         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
719         setup_pcc_mapping
720
721         do_facet $SINGLEAGT "echo -n attach_mmap_data > $file" ||
722                 error "echo $file failed"
723
724         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
725                 error "failed to attach file $file"
726         check_lpcc_state $file "readwrite"
727
728         local content=$($MMAP_CAT $file)
729
730         [[ $content == "attach_mmap_data" ]] ||
731                 error "mmap cat data mismatch: $content"
732
733         $LFS hsm_restore $file || error "failed to restore $file"
734         wait_request_state $(path2fid $file) RESTORE SUCCEED
735         check_lpcc_state $file "none"
736
737         content=$($MMAP_CAT $file)
738         [[ $content == "attach_mmap_data" ]] ||
739                 error "mmap cat data mismatch: $content"
740 }
741 run_test 5 "Mmap & cat a RW-PCC cached file"
742
743 test_6() {
744         local loopfile="$TMP/$tfile"
745         local mntpt="/mnt/pcc.$tdir"
746         local hsm_root="$mntpt/$tdir"
747         local file=$DIR/$tfile
748         local content
749
750         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
751         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
752         setup_pcc_mapping
753
754         echo -n mmap_write_data > $file || error "echo write $file failed"
755         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
756                 error "failed to attach file $file"
757         check_lpcc_state $file "readwrite"
758
759         do_facet $SINGLEAGT $MULTIOP $file OSMWUc ||
760                 error "could not mmap $file"
761         check_lpcc_state $file "readwrite"
762         content=$(do_facet $SINGLEAGT $MMAP_CAT $file)
763         # After mmap write via multiop, the first character of each page
764         # increases with 1.
765         [[ $content == "nmap_write_data" ]] ||
766                 error "mmap write data mismatch: $content"
767         check_lpcc_state $file "readwrite"
768
769         do_facet $SINGLEAGT $LFS pcc detach $file ||
770                 error "failed to detach file $file"
771         wait_request_state $(path2fid $file) REMOVE SUCCEED
772
773         content=$(do_facet $SINGLEAGT $MMAP_CAT $file)
774         [[ $content == "nmap_write_data" ]] ||
775                 error "mmap write data mismatch: $content"
776 }
777 run_test 6 "Test mmap write on RW-PCC "
778
779 test_7a() {
780         local loopfile="$TMP/$tfile"
781         local mntpt="/mnt/pcc.$tdir"
782         local hsm_root="$mntpt/$tdir"
783         local file=$DIR/$tfile
784         local content
785
786         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
787         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
788         setup_pcc_mapping
789
790         echo "QQQQQ" > $file
791         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
792                 error "failed to attach file $file"
793         check_lpcc_state $file "readwrite"
794         check_file_data $SINGLEAGT $file "QQQQQ"
795         # define OBD_FAIL_LLITE_PCC_DETACH_MKWRITE      0x1412
796         do_facet $SINGLEAGT $LCTL set_param fail_loc=0x1412
797         # HSM released exists archived status
798         check_hsm_flags $file "0x0000000d"
799
800         # multiop mmap write increase the first character of each page with 1
801         do_facet $SINGLEAGT $MULTIOP $file OSMWUc ||
802                 error "mmap write $file failed"
803         check_lpcc_state $file "none"
804         content=$(do_facet $SINGLEAGT $MMAP_CAT $file)
805         [[ $content == "RQQQQ" ]] || error "data mismatch: $content"
806 }
807 run_test 7a "Fake file detached between fault() and page_mkwrite() for RW-PCC"
808
809 test_7b() {
810         local loopfile="$TMP/$tfile"
811         local mntpt="/mnt/pcc.$tdir"
812         local hsm_root="$mntpt/$tdir"
813         local file=$DIR/$tfile
814         local content
815         local pid
816
817         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
818         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
819         setup_pcc_mapping $SINGLEAGT \
820                 "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0"
821
822         echo "QQQQQ" > $file
823         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
824                 error "failed to attach file $file"
825         check_lpcc_state $file "readwrite"
826         check_file_data $SINGLEAGT $file "QQQQQ"
827         # define OBD_FAIL_LLITE_PCC_MKWRITE_PAUSE       0x1413
828         do_facet $SINGLEAGT $LCTL set_param fail_loc=0x1413 fail_val=20
829         # HSM released exists archived status
830         check_hsm_flags $file "0x0000000d"
831
832         # multiop mmap write increases the first character of each page with 1
833         do_facet $SINGLEAGT $MULTIOP $file OSMWUc &
834         pid=$!
835
836         sleep 3
837         do_facet $SINGLEAGT $LFS pcc detach -k $file ||
838                 error "failed to detach file $file"
839
840         wait $pid || error "multiop mmap write failed"
841         check_lpcc_state $file "none"
842         content=$(do_facet $SINGLEAGT $MMAP_CAT $file)
843         [[ $content == "RQQQQ" ]] || error "data mismatch: $content"
844 }
845 run_test 7b "Test the race with concurrent mkwrite and detach"
846
847 test_8() {
848         local loopfile="$TMP/$tfile"
849         local mntpt="/mnt/pcc.$tdir"
850         local hsm_root="$mntpt/$tdir"
851         local file=$DIR/$tfile
852
853         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
854         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
855         setup_pcc_mapping
856
857         echo "QQQQQ" > $file
858         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
859                 error "failed to attach file $file"
860         check_lpcc_state $file "readwrite"
861         check_file_data $SINGLEAGT $file "QQQQQ"
862
863         # define OBD_FAIL_LLITE_PCC_FAKE_ERROR  0x1411
864         do_facet $SINGLEAGT $LCTL set_param fail_loc=0x1411
865         do_facet $SINGLEAGT "echo -n ENOSPC_write > $file"
866         # Above write will return -ENOSPC failure and retry the IO on normal
867         # IO path. It will restore the HSM released file.
868         check_lpcc_state $file "none"
869         check_file_data $SINGLEAGT $file "ENOSPC_write"
870 }
871 run_test 8 "Test fake -ENOSPC tolerance for RW-PCC"
872
873 test_9() {
874         local loopfile="$TMP/$tfile"
875         local mntpt="/mnt/pcc.9a"
876         local hsm_root="$mntpt/$tdir"
877         local file=$DIR/$tfile
878
879         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
880
881         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMVER" -h "$hsm_root"
882         setup_pcc_mapping
883         do_facet $SINGLEAGT $LCTL pcc list $MOUNT
884
885         touch $file || error "touch $file failed"
886         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
887                 error "fail to attach $file"
888         check_lpcc_state $file "readwrite"
889         # write 60M data, it is larger than the capacity of PCC backend
890         do_facet $SINGLEAGT dd if=/dev/zero of=$file bs=1M count=60 ||
891                 error "fail to dd write $file"
892         check_lpcc_state $file "none"
893         check_file_size $SINGLEAGT $file 62914560
894 }
895 run_test 9 "Test -ENOSPC tolerance on loop PCC device for RW-PCC"
896
897 test_usrgrp_quota() {
898         local loopfile="$TMP/$tfile"
899         local mntpt="/mnt/pcc.$tdir"
900         local hsm_root="$mntpt/$tdir"
901         local ug=$1
902         local id=$RUNAS_ID
903
904         [[ $ug == "g" ]] && id=$RUNAS_GID
905
906         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
907         do_facet $SINGLEAGT quotacheck -c$ug $mntpt ||
908                 error "quotacheck -c$ug $mntpt failed"
909         do_facet $SINGLEAGT quotaon -$ug $mntpt ||
910                 error "quotaon -$ug $mntpt failed"
911         do_facet $SINGLEAGT setquota -$ug $id 0 20480 0 0 $mntpt ||
912                 error "setquota -$ug $id on $mntpt failed"
913         do_facet $SINGLEAGT repquota -${ug}vs $mntpt
914
915         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMVER" -h "$hsm_root"
916         setup_pcc_mapping
917         do_facet $SINGLEAGT $LCTL pcc list $MOUNT
918
919         mkdir $DIR/$tdir || error "mkdir $DIR/$tdir failed"
920
921         local file1=$DIR/$tdir/${ug}quotaA
922         local file2=$DIR/$tdir/${ug}quotaB
923
924         dd if=/dev/zero of=$file1 bs=1M count=15 ||
925                 error "dd write $file1 failed"
926         dd if=/dev/zero of=$file2 bs=1M count=15 ||
927                 error "dd write $file2 failed"
928         chown $RUNAS_ID:$RUNAS_GID $file1 ||
929                 error "chown $RUNAS_ID:$RUNAS_GID $file1 failed"
930         chown $RUNAS_ID:$RUNAS_GID $file2 ||
931                 error "chown $RUNAS_ID:$RUNAS_GID $file2 failed"
932         do_facet $SINGLEAGT $RUNAS $LFS pcc attach -i $HSM_ARCHIVE_NUMBER \
933                 $file1 || error "attach $file1 failed"
934         do_facet $SINGLEAGT $RUNAS $LFS pcc attach -i $HSM_ARCHIVE_NUMBER \
935                 $file2 && error "attach $file2 should fail due to quota limit"
936         check_lpcc_state $file1 "readwrite"
937         check_lpcc_state $file2 "none"
938
939         do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$file1 bs=1M count=30 ||
940                 error "dd write $file1 failed"
941         # -EDQUOT error should be tolerated via fallback to normal Lustre path.
942         check_lpcc_state $file1 "none"
943         do_facet $SINGLEAGT $LFS pcc detach -k $file1 ||
944                 error "failed to detach file $file"
945         rm $file1 $file2
946 }
947
948 test_10a() {
949         test_usrgrp_quota "u"
950 }
951 run_test 10a "Test RW-PCC with user quota on loop PCC device"
952
953 test_10b() {
954         test_usrgrp_quota "g"
955 }
956 run_test 10b "Test RW-PCC with group quota on loop PCC device"
957
958 test_11() {
959         local loopfile="$TMP/$tfile"
960         local mntpt="/mnt/pcc.$tdir"
961         local hsm_root="$mntpt/$tdir"
962         local file=$DIR/$tfile
963         local -a lpcc_path
964         local lpcc_dir
965
966         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
967         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
968         setup_pcc_mapping
969
970         do_facet $SINGLEAGT "echo -n QQQQQ > $file"
971         lpcc_path=$(lpcc_fid2path $hsm_root $file)
972         lpcc_dir=$(dirname $lpcc_path)
973         echo "Lustre file: $file LPCC dir: $lpcc_dir"
974         do_facet $SINGLEAGT mkdir -p $lpcc_dir ||
975                 error "mkdir -p $lpcc_dir failed"
976         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
977                 error "failed to attach $file"
978         check_lpcc_state $file "readwrite"
979         check_file_data $SINGLEAGT $file "QQQQQ"
980         do_facet $SINGLEAGT $LFS pcc detach -k $file ||
981                 error "failed to detach $file"
982         rm $file || error "rm $file failed"
983
984         # The parent directory of the PCC file is immutable
985         do_facet $SINGLEAGT "echo -n immutable_dir > $file"
986         lpcc_path=$(lpcc_fid2path $hsm_root $file)
987         lpcc_dir=$(dirname $lpcc_path)
988         echo "Lustre file: $file LPCC dir: $lpcc_dir"
989         do_facet $SINGLEAGT mkdir -p $lpcc_dir ||
990                 error "mkdir -p $lpcc_dir failed"
991         do_facet $SINGLEAGT chattr +i $lpcc_dir ||
992                 error "chattr +i $lpcc_dir failed"
993         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file &&
994                 error "attach $file with immutable directory should be failed"
995         do_facet $SINGLEAGT chattr -i $lpcc_dir ||
996                 error "chattr -i $lpcc_dir failed"
997         rm $file || error "rm $file failed"
998
999         # The PCC file path is set to a directory
1000         do_facet $SINGLEAGT "echo -n pcc_file_path_is_dir > $file"
1001         lpcc_path=$(lpcc_fid2path $hsm_root $file)
1002         do_facet $SINGLEAGT mkdir -p $lpcc_path ||
1003                 error "mkdir -p $lpcc_path failed"
1004         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file &&
1005                 error "attach $file should fail as PCC path is a directory"
1006         rm $file || error "rm $file failed"
1007 }
1008 run_test 11 "Test attach fault injection with simulated PCC file path"
1009
1010 test_12() {
1011         local file=$DIR/$tfile
1012         local hsm_root=$(hsm_root)
1013         local -a lpcc_path
1014         local pid
1015
1016         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
1017         setup_pcc_mapping $SINGLEAGT \
1018                 "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0"
1019
1020         echo  -n race_rw_attach_hsmremove > $file
1021         lpcc_path=$(lpcc_fid2path $hsm_root $file)
1022         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
1023                 error "attach $file failed"
1024         do_facet $SINGLEAGT $LFS pcc detach -k $file ||
1025                 error "detach $file failed"
1026         # HSM released exists archived status
1027         check_hsm_flags $file "0x0000000d"
1028         # define OBD_FAIL_LLITE_PCC_ATTACH_PAUSE        0x1414
1029         do_facet $SINGLEAGT $LCTL set_param fail_loc=0x1414 fail_val=20
1030         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file &
1031         pid=$!
1032         $LFS hsm_state $file
1033         sleep 3
1034         wait_request_state $(path2fid $file) RESTORE SUCCEED
1035         $LFS hsm_remove $file || error "hsm remove $file failed"
1036         wait $pid && error "RW-PCC attach $file should fail"
1037         do_facet $SINGLEAGT "[ -f $lpcc_path ]" &&
1038                 error "RW-PCC cached file '$lpcc_path' should be removed"
1039
1040         return 0
1041 }
1042 run_test 12 "RW-PCC attach races with concurrent HSM remove"
1043
1044 test_rule_id() {
1045         local idstr="${1}id"
1046         local rule="${idstr}={$2}"
1047         local myRUNAS="$3"
1048         local file=$DIR/$tdir/$tfile
1049
1050         setup_pcc_mapping $SINGLEAGT \
1051                 "$rule\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0"
1052         $LCTL pcc list $MOUNT
1053
1054         do_facet $SINGLEAGT mkdir -p $DIR/$tdir
1055         chmod 777 $DIR/$tdir || error "chmod 0777 $DIR/$tdir failed"
1056
1057         rm -f $file || error "rm $file failed"
1058         do_facet $SINGLEAGT $myRUNAS dd if=/dev/zero of=$file bs=1024 count=1 ||
1059                 error "failed to dd write to $file"
1060         check_lpcc_state $file "readwrite"
1061         do_facet $SINGLEAGT $myRUNAS dd if=$file of=/dev/null bs=1024 count=1 ||
1062                 error "failed to dd read from $file"
1063         do_facet $SINGLEAGT $myRUNAS $TRUNCATE $file 256 ||
1064                 error "failed to truncate $file"
1065         do_facet $SINGLEAGT $myRUNAS $TRUNCATE $file 2048 ||
1066                 error "failed to truncate $file"
1067         do_facet $SINGLEAGT $myRUNAS dd if=/dev/zero of=$file bs=1024 count=1 ||
1068                 error "failed to dd write from $file"
1069         check_lpcc_state $file "readwrite"
1070
1071         do_facet $SINGLEAGT $myRUNAS $LFS pcc detach $file ||
1072                 error "failed to detach file $file"
1073         wait_request_state $(path2fid $file) REMOVE SUCCEED
1074         check_lpcc_state $file "none"
1075
1076         cleanup_pcc_mapping
1077 }
1078
1079 test_13a() {
1080         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
1081         test_rule_id "u" "500" "runas -u 500"
1082         test_rule_id "g" "500" "runas -u 500 -g 500"
1083 }
1084 run_test 13a "Test auto RW-PCC create caching for UID/GID rule"
1085
1086 test_13b() {
1087         local file
1088
1089         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
1090         setup_pcc_mapping $SINGLEAGT \
1091                 "fname={*.h5\ suffix.*\ Mid*dle}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0"
1092         $LCTL pcc list $MOUNT
1093
1094         do_facet $SINGLEAGT mkdir -p $DIR/$tdir
1095         chmod 777 $DIR/$tdir || error "chmod 0777 $DIR/$tdir failed"
1096
1097         file=$DIR/$tdir/prefix.h5
1098         do_facet $SINGLEAGT dd if=/dev/zero of=$file bs=1024 count=1 ||
1099                 error "failed to dd write to $file"
1100         check_lpcc_state $file "readwrite"
1101         do_facet $SINGLEAGT $myRUNAS $LFS pcc detach -k $file ||
1102                 error "failed to detach file $file"
1103         check_lpcc_state $file "none"
1104         rm $file || error "rm $file failed"
1105
1106         file=$DIR/$tdir/suffix.doc
1107         do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$file bs=1024 count=1 ||
1108                 error "failed to dd write to $file"
1109         check_lpcc_state $file "readwrite"
1110         do_facet $SINGLEAGT $myRUNAS $LFS pcc detach -k $file ||
1111                 error "failed to detach file $file"
1112         check_lpcc_state $file "none"
1113         rm $file || error "rm $file failed"
1114
1115         file=$DIR/$tdir/MidPADdle
1116         do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$file bs=1024 count=1 ||
1117                 error "failed to dd write to $file"
1118         check_lpcc_state $file "readwrite"
1119         do_facet $SINGLEAGT $myRUNAS $LFS pcc detach -k $file ||
1120                 error "failed to detach file $file"
1121         check_lpcc_state $file "none"
1122         rm $file || error "rm $file failed"
1123
1124         file=$DIR/$tdir/Midpad
1125         do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$file bs=1024 count=1 ||
1126                 error "failed to dd write to $file"
1127         check_lpcc_state $file "none"
1128         rm $file || error "rm $file failed"
1129 }
1130 run_test 13b "Test auto RW-PCC create caching for file name with wildcard"
1131
1132 test_13c() {
1133         local file
1134         local myRUNAS
1135         local loopfile="$TMP/$tfile"
1136         local mntpt="/mnt/pcc.$tdir"
1137         local hsm_root="$mntpt/$tdir"
1138
1139         ! is_project_quota_supported &&
1140                 echo "Skip project quota is not supported" && return 0
1141
1142         enable_project_quota
1143         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
1144         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
1145         setup_pcc_mapping $SINGLEAGT \
1146                 "projid={100\ 200}\&fname={*.h5},uid={500}\&gid={1000}\ rwid=$HSM_ARCHIVE_NUMBER"
1147         $LCTL pcc list $MOUNT
1148         do_facet $SINGLEAGT mkdir -p $DIR/$tdir
1149         chmod 777 $DIR/$tdir || error "chmod 0777 $DIR/$tdir failed"
1150
1151         mkdir -p $DIR/$tdir/proj || error "mkdir $DIR/$tdir/proj failed"
1152         mkdir -p $DIR/$tdir/proj2 || error "mkdir $DIR/$tdir/proj2 failed"
1153         $LFS project -sp 100 $DIR/$tdir/proj ||
1154                 error "failed to set project for $DIR/$tdir/proj"
1155         $LFS project -sp 200 $DIR/$tdir/proj2 ||
1156                 error "failed to set project for $DIR/$tdir/proj2"
1157
1158         file=$DIR/$tdir/proj/notcache
1159         do_facet $SINGLEAGT dd if=/dev/zero of=$file bs=1024 count=1 ||
1160                 error "failed to dd write to $file"
1161         check_lpcc_state $file "none"
1162         rm $file || error "rm $file failed"
1163
1164         file=$DIR/$tdir/proj/autocache.h5
1165         do_facet $SINGLEAGT dd if=/dev/zero of=$file bs=1024 count=1 ||
1166                 error "failed to dd write to $file"
1167         check_lpcc_state $file "readwrite"
1168         do_facet $SINGLEAGT $LFS pcc detach -k $file ||
1169                 error "failed to detach $file"
1170         rm $file || error "rm $file failed"
1171
1172         file=$DIR/$tdir/proj2/notcache
1173         do_facet $SINGLEAGT dd if=/dev/zero of=$file bs=1024 count=1 ||
1174                 error "failed to dd write to $file"
1175         check_lpcc_state $file "none"
1176         rm $file || error "rm $file failed"
1177
1178         file=$DIR/$tdir/proj2/autocache.h5
1179         do_facet $SINGLEAGT dd if=/dev/zero of=$file bs=1024 count=1 ||
1180                 error "failed to dd write to $file"
1181         check_lpcc_state $file "readwrite"
1182         do_facet $SINGLEAGT $LFS pcc detach -k $file ||
1183                 error "failed to detach $file"
1184         rm $file || error "rm $file failed"
1185
1186         file=$DIR/$tdir/ugidcache
1187         myRUNAS="runas -u 500 -g 1000"
1188         do_facet $SINGLEAGT $myRUNAS dd if=/dev/zero of=$file bs=1024 count=1 ||
1189                 error "failed to dd write to $file"
1190         check_lpcc_state $file "readwrite"
1191         do_facet $SINGLEAGT $LFS pcc detach -k $file ||
1192                 error "failed to detach $file"
1193         rm $file || error "rm $file failed"
1194 }
1195 run_test 13c "Check auto RW-PCC create caching for UID/GID/ProjID/fname rule"
1196
1197 test_14() {
1198         local file=$DIR/$tdir/$tfile
1199
1200         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
1201         setup_pcc_mapping $SINGLEAGT \
1202                 "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0"
1203
1204         mkdir -p $DIR/$tdir || error "mkdir -p $DIR/$tdir failed"
1205         do_facet $SINGLEAGT "echo -n autodetach_data > $file"
1206         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER \
1207                 $file || error "PCC attach $file failed"
1208         check_lpcc_state $file "readwrite"
1209
1210         # Revoke the layout lock, the PCC-cached file will be
1211         # detached automatically.
1212         do_facet $SINGLEAGT $LCTL \
1213                 set_param ldlm.namespaces.*mdc*.lru_size=clear
1214         check_file_data $SINGLEAGT $file "autodetach_data"
1215         check_lpcc_state $file "none"
1216 }
1217 run_test 14 "Revocation of the layout lock should detach the file automatically"
1218
1219 test_15() {
1220         local loopfile="$TMP/$tfile"
1221         local mntpt="/mnt/pcc.$tdir"
1222         local hsm_root="$mntpt/$tdir"
1223         local file=$DIR/$tdir/$tfile
1224
1225         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
1226         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
1227         setup_pcc_mapping
1228
1229         mkdir $DIR/$tdir || error "mkdir $DIR/$tdir failed"
1230         chmod 777 $DIR/$tdir || error "chmod 777 $DIR/$tdir failed"
1231
1232         echo "Check open attach for non-root user"
1233         do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$file bs=1024 count=1 ||
1234                 error "failed to dd write to $file"
1235         do_facet $SINGLEAGT $RUNAS $LFS pcc attach -i $HSM_ARCHIVE_NUMBER \
1236                 $file || error "failed to attach file $file"
1237         do_facet $SINGLEAGT $RUNAS $LFS pcc state $file
1238         check_lpcc_state $file "readwrite" $SINGLEAGT "$RUNAS"
1239         # Revoke the layout lock, the PCC-cached file will be
1240         # detached automatically.
1241         do_facet $SINGLEAGT $LCTL \
1242                 set_param ldlm.namespaces.*mdc*.lru_size=clear
1243         check_lpcc_state $file "readwrite" $SINGLEAGT "$RUNAS"
1244         # Detach the file but keep the cache , as the file layout generation
1245         # is not changed, so the file is still valid cached in PCC, and can
1246         # be reused from PCC cache directly.
1247         do_facet $SINGLEAGT $RUNAS $LFS pcc detach -k $file ||
1248                 error "PCC detach $file failed"
1249         check_lpcc_state $file "readwrite" $SINGLEAGT "$RUNAS"
1250         do_facet $SINGLEAGT $RUNAS $LFS pcc detach $file ||
1251                 error "PCC detach $file failed"
1252         rm $file || error "rm $file failed"
1253
1254         echo "check open attach for root user"
1255         do_facet $SINGLEAGT "echo -n autoattach_data > $file"
1256         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER \
1257                 $file || error "PCC attach $file failed"
1258         check_lpcc_state $file "readwrite"
1259
1260         # Revoke the layout lock, the PCC-cached file will be
1261         # detached automatically.
1262         do_facet $SINGLEAGT $LCTL \
1263                 set_param ldlm.namespaces.*mdc*.lru_size=clear
1264         check_file_data $SINGLEAGT $file "autoattach_data"
1265         check_lpcc_state $file "readwrite"
1266
1267         # Detach the file with -k option, as the file layout generation
1268         # is not changed, so the file is still valid cached in PCC,
1269         # and can be reused from PCC cache directly.
1270         do_facet $SINGLEAGT $LFS pcc detach -k $file ||
1271                 error "PCC detach $file failed"
1272         check_lpcc_state $file "readwrite"
1273         # HSM released exists archived status
1274         check_hsm_flags $file "0x0000000d"
1275         check_file_data $SINGLEAGT $file "autoattach_data"
1276
1277         # HSM restore the PCC cached file, the layout generation
1278         # was changed, so the file can not be auto attached.
1279         $LFS hsm_restore $file || error "failed to restore $file"
1280         wait_request_state $(path2fid $file) RESTORE SUCCEED
1281         check_lpcc_state $file "none"
1282         # HSM exists archived status
1283         check_hsm_flags $file "0x00000009"
1284
1285 }
1286 run_test 15 "Test auto attach at open when file is still valid cached"
1287
1288 test_16() {
1289         local loopfile="$TMP/$tfile"
1290         local mntpt="/mnt/pcc.$tdir"
1291         local hsm_root="$mntpt/$tdir"
1292         local file=$DIR/$tfile
1293         local -a lpcc_path
1294
1295         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
1296         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
1297         setup_pcc_mapping
1298
1299         do_facet $SINGLEAGT "echo -n detach_data > $file"
1300         lpcc_path=$(lpcc_fid2path $hsm_root $file)
1301         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER \
1302                 $file || error "PCC attach $file failed"
1303         check_lpcc_state $file "readwrite"
1304         # HSM released exists archived status
1305         check_hsm_flags $file "0x0000000d"
1306
1307         echo "Test for reusing valid PCC cache"
1308         # Valid PCC cache can be reused
1309         do_facet $SINGLEAGT $LFS pcc detach -k $file ||
1310                 error "PCC detach $file failed"
1311         check_lpcc_state $file "readwrite"
1312         # HSM released exists archived status
1313         check_hsm_flags $file "0x0000000d"
1314
1315         echo "Test for the default detach"
1316         # Permanent detach by default, it will remove the PCC copy
1317         do_facet $SINGLEAGT $LFS pcc detach $file ||
1318                 error "PCC detach $file failed"
1319         wait_request_state $(path2fid $file) REMOVE SUCCEED
1320         check_lpcc_state $file "none"
1321         # File is removed from PCC backend
1322         check_hsm_flags $file "0x00000000"
1323         do_facet $SINGLEAGT "[ -f $lpcc_path ]" &&
1324                 error "RW-PCC cached file '$lpcc_path' should be removed"
1325
1326         return 0
1327 }
1328 run_test 16 "Test detach with different options"
1329
1330 test_17() {
1331         local agt_host=$(facet_active_host $SINGLEAGT)
1332         local loopfile="$TMP/$tfile"
1333         local mntpt="/mnt/pcc.$tdir"
1334         local hsm_root="$mntpt/$tdir"
1335         local file=$DIR/$tfile
1336
1337         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
1338         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
1339         setup_pcc_mapping $SINGLEAGT \
1340                 "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ open_attach=0\ stat_attach=0"
1341
1342         do_facet $SINGLEAGT $LCTL pcc list $MOUNT
1343
1344         do_facet $SINGLEAGT "echo -n layout_refresh_data > $file"
1345         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
1346                 error "PCC attach $file failed"
1347         check_lpcc_state $file "readwrite"
1348
1349         do_facet $SINGLEAGT $LFS pcc detach -k $file ||
1350                 error "PCC detach $file failed"
1351         check_lpcc_state $file "none"
1352
1353         # Truncate should attach the file into PCC automatically
1354         # as the PCC copy is still valid.
1355         echo "Verify auto attach during IO for truncate"
1356         do_facet $SINGLEAGT $TRUNCATE $file 4 || error "truncate $file failed"
1357         check_lpcc_state $file "readwrite"
1358
1359         echo "Verify auto attach during IO for read/write"
1360         rmultiop_start $agt_host $file O_r || error "open $file failed"
1361         sleep 3
1362
1363         # Revoke the layout lock, the PCC-cached file will be
1364         # detached automatically.
1365         do_facet $SINGLEAGT $LCTL \
1366                 set_param ldlm.namespaces.*mdc*.lru_size=clear
1367
1368         check_lpcc_state $file "none"
1369         rmultiop_stop $agt_host || error "close $file failed"
1370         sleep 3
1371         check_lpcc_state $file "readwrite"
1372
1373         do_facet $SINGLEAGT $LFS pcc detach -k $file ||
1374                 error "PCC detach $file failed"
1375         check_lpcc_state $file "none"
1376 }
1377 run_test 17 "Test auto attach for layout refresh"
1378
1379 test_18() {
1380         local agt_host=$(facet_active_host $SINGLEAGT)
1381         local loopfile="$TMP/$tfile"
1382         local mntpt="/mnt/pcc.$tdir"
1383         local hsm_root="$mntpt/$tdir"
1384         local file=$DIR/$tfile
1385         local oldmd5
1386         local newmd5
1387
1388         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
1389         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
1390         setup_pcc_mapping $SINGLEAGT \
1391                 "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER"
1392
1393         do_facet $SINGLEAGT $LCTL pcc list $MOUNT
1394         do_facet $SINGLEAGT dd if=/dev/urandom of=$file bs=1M count=4 ||
1395                 error "failed to write $file"
1396         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
1397                 error "failed to attach $file"
1398         do_facet $SINGLEAGT $LFS pcc state $file
1399         check_lpcc_state $file "readwrite"
1400         do_facet $SINGLEAGT $LFS pcc detach --keep $file ||
1401                 error "failed to detach $file"
1402         do_facet $SINGLEAGT $LFS pcc state $file
1403         $CHECKSTAT -s 4194304 $file
1404         dd if=/dev/zero of=$DIR2/$tfile seek=1k bs=1k count=1 ||
1405                 error "failed to write $DIR2/$tfile"
1406         oldmd5=$(md5sum $DIR2/$tfile | awk '{print $1}')
1407         $CHECKSTAT -s 1049600 $DIR2/$tfile || error "$DIR2/$tfile size wrong"
1408
1409         local lpcc_path=$(lpcc_fid2path $hsm_root $file)
1410
1411         do_facet $SINGLEAGT $LFS pcc state $file
1412         check_file_size $SINGLEAGT $lpcc_path 4194304
1413         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
1414                 error "failed to attach $file"
1415         check_lpcc_sizes $SINGLEAGT $lpcc_path $file 1049600
1416         newmd5=$(do_facet $SINGLEAGT md5sum $file | awk '{print $1}')
1417         [ "$oldmd5" == "$newmd5" ] || error "md5sum differ: $oldmd5 != $newmd5"
1418         do_facet $SINGLEAGT $LFS pcc detach $file ||
1419                 error "failed to detach $file"
1420 }
1421 run_test 18 "Verify size correctness after re-attach the file"
1422
1423 test_19() {
1424         local agt_host=$(facet_active_host $SINGLEAGT)
1425         local loopfile="$TMP/$tfile"
1426         local mntpt="/mnt/pcc.$tdir"
1427         local hsm_root="$mntpt/$tdir"
1428         local file=$DIR/$tfile
1429
1430         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
1431         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
1432         setup_pcc_mapping $SINGLEAGT \
1433                 "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0"
1434
1435         do_facet $SINGLEAGT "echo -n QQQQQ > $file" || error "echo $file failed"
1436         lpcc_path=$(lpcc_fid2path $hsm_root $file)
1437         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
1438                 error "Failed to attach $file"
1439         check_lpcc_state $file "readwrite"
1440         check_lpcc_sizes $SINGLEAGT $file $lpcc_path 5
1441         do_facet $SINGLEAGT $LFS pcc detach --keep $file ||
1442                 error "Failed to detach $file"
1443         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
1444                 error "Failed to attach $file"
1445         check_lpcc_sizes $SINGLEAGT $file $lpcc_path 5
1446         do_facet $SINGLEAGT $LFS pcc detach --keep $file ||
1447                 error "Failed to detach $file"
1448 }
1449 run_test 19 "Verify the file re-attach works as expected"
1450
1451 test_20() {
1452         local agt_host=$(facet_active_host $SINGLEAGT)
1453         local loopfile="$TMP/$tfile"
1454         local mntpt="/mnt/pcc.$tdir"
1455         local hsm_root="$mntpt/$tdir"
1456         local file=$DIR/$tfile
1457
1458         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
1459         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
1460         setup_pcc_mapping $SINGLEAGT \
1461                 "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER"
1462
1463         do_facet $SINGLEAGT "echo -n QQQQQ > $file" ||
1464                 error "echo $file failed"
1465         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
1466                 error "Failed to attach $file"
1467         do_facet $SINGLEAGT "echo 3 > /proc/sys/vm/drop_caches"
1468         check_lpcc_state $file "readwrite"
1469         do_facet $SINGLEAGT "echo 3 > /proc/sys/vm/drop_caches"
1470         do_facet $SINGLEAGT "echo 3 > /proc/sys/vm/drop_caches"
1471         check_lpcc_state $file "readwrite"
1472         do_facet $SINGLEAGT $LFS pcc detach $file ||
1473                 error "Failed to detach $file"
1474 }
1475 run_test 20 "Auto attach works after the inode was once evicted from cache"
1476
1477 complete $SECONDS
1478 check_and_cleanup_lustre
1479 exit_status