Whamcloud - gitweb
LU-13128 osc: glimpse and lock cancel race
[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         $LUSTRE/tests/mmap_sanity -d $DIR/$tdir -m $DIR2/$tdir -e 7 ||
701                 error "mmap_sanity test failed"
702         sync; sleep 1; sync
703
704         rm -rf $DIR/$tdir || error "failed to remove $DIR/$tdir"
705 }
706 run_test 4 "Auto cache test for mmap"
707
708 test_5() {
709         local file=$DIR/$tfile
710         local loopfile="$TMP/$tfile"
711         local mntpt="/mnt/pcc.$tdir"
712         local hsm_root="$mntpt/$tdir"
713
714         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
715         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
716         setup_pcc_mapping
717
718         do_facet $SINGLEAGT "echo -n attach_mmap_data > $file" ||
719                 error "echo $file failed"
720
721         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
722                 error "failed to attach file $file"
723         check_lpcc_state $file "readwrite"
724
725         local content=$($MMAP_CAT $file)
726
727         [[ $content == "attach_mmap_data" ]] ||
728                 error "mmap cat data mismatch: $content"
729
730         $LFS hsm_restore $file || error "failed to restore $file"
731         wait_request_state $(path2fid $file) RESTORE SUCCEED
732         check_lpcc_state $file "none"
733
734         content=$($MMAP_CAT $file)
735         [[ $content == "attach_mmap_data" ]] ||
736                 error "mmap cat data mismatch: $content"
737 }
738 run_test 5 "Mmap & cat a RW-PCC cached file"
739
740 test_6() {
741         local loopfile="$TMP/$tfile"
742         local mntpt="/mnt/pcc.$tdir"
743         local hsm_root="$mntpt/$tdir"
744         local file=$DIR/$tfile
745         local content
746
747         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
748         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
749         setup_pcc_mapping
750
751         echo -n mmap_write_data > $file || error "echo write $file failed"
752         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
753                 error "failed to attach file $file"
754         check_lpcc_state $file "readwrite"
755
756         do_facet $SINGLEAGT $MULTIOP $file OSMWUc ||
757                 error "could not mmap $file"
758         check_lpcc_state $file "readwrite"
759         content=$(do_facet $SINGLEAGT $MMAP_CAT $file)
760         # After mmap write via multiop, the first character of each page
761         # increases with 1.
762         [[ $content == "nmap_write_data" ]] ||
763                 error "mmap write data mismatch: $content"
764         check_lpcc_state $file "readwrite"
765
766         do_facet $SINGLEAGT $LFS pcc detach $file ||
767                 error "failed to detach file $file"
768         wait_request_state $(path2fid $file) REMOVE SUCCEED
769
770         content=$(do_facet $SINGLEAGT $MMAP_CAT $file)
771         [[ $content == "nmap_write_data" ]] ||
772                 error "mmap write data mismatch: $content"
773 }
774 run_test 6 "Test mmap write on RW-PCC "
775
776 test_7a() {
777         local loopfile="$TMP/$tfile"
778         local mntpt="/mnt/pcc.$tdir"
779         local hsm_root="$mntpt/$tdir"
780         local file=$DIR/$tfile
781         local content
782
783         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
784         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
785         setup_pcc_mapping
786
787         echo "QQQQQ" > $file
788         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
789                 error "failed to attach file $file"
790         check_lpcc_state $file "readwrite"
791         check_file_data $SINGLEAGT $file "QQQQQ"
792         # define OBD_FAIL_LLITE_PCC_DETACH_MKWRITE      0x1412
793         do_facet $SINGLEAGT $LCTL set_param fail_loc=0x1412
794         # HSM released exists archived status
795         check_hsm_flags $file "0x0000000d"
796
797         # multiop mmap write increase the first character of each page with 1
798         do_facet $SINGLEAGT $MULTIOP $file OSMWUc ||
799                 error "mmap write $file failed"
800         check_lpcc_state $file "none"
801         content=$(do_facet $SINGLEAGT $MMAP_CAT $file)
802         [[ $content == "RQQQQ" ]] || error "data mismatch: $content"
803 }
804 run_test 7a "Fake file detached between fault() and page_mkwrite() for RW-PCC"
805
806 test_7b() {
807         local loopfile="$TMP/$tfile"
808         local mntpt="/mnt/pcc.$tdir"
809         local hsm_root="$mntpt/$tdir"
810         local file=$DIR/$tfile
811         local content
812         local pid
813
814         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
815         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
816         setup_pcc_mapping $SINGLEAGT \
817                 "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0"
818
819         echo "QQQQQ" > $file
820         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
821                 error "failed to attach file $file"
822         check_lpcc_state $file "readwrite"
823         check_file_data $SINGLEAGT $file "QQQQQ"
824         # define OBD_FAIL_LLITE_PCC_MKWRITE_PAUSE       0x1413
825         do_facet $SINGLEAGT $LCTL set_param fail_loc=0x1413 fail_val=20
826         # HSM released exists archived status
827         check_hsm_flags $file "0x0000000d"
828
829         # multiop mmap write increases the first character of each page with 1
830         do_facet $SINGLEAGT $MULTIOP $file OSMWUc &
831         pid=$!
832
833         sleep 3
834         do_facet $SINGLEAGT $LFS pcc detach -k $file ||
835                 error "failed to detach file $file"
836
837         wait $pid || error "multiop mmap write failed"
838         check_lpcc_state $file "none"
839         content=$(do_facet $SINGLEAGT $MMAP_CAT $file)
840         [[ $content == "RQQQQ" ]] || error "data mismatch: $content"
841 }
842 run_test 7b "Test the race with concurrent mkwrite and detach"
843
844 test_8() {
845         local loopfile="$TMP/$tfile"
846         local mntpt="/mnt/pcc.$tdir"
847         local hsm_root="$mntpt/$tdir"
848         local file=$DIR/$tfile
849
850         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
851         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
852         setup_pcc_mapping
853
854         echo "QQQQQ" > $file
855         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
856                 error "failed to attach file $file"
857         check_lpcc_state $file "readwrite"
858         check_file_data $SINGLEAGT $file "QQQQQ"
859
860         # define OBD_FAIL_LLITE_PCC_FAKE_ERROR  0x1411
861         do_facet $SINGLEAGT $LCTL set_param fail_loc=0x1411
862         do_facet $SINGLEAGT "echo -n ENOSPC_write > $file"
863         # Above write will return -ENOSPC failure and retry the IO on normal
864         # IO path. It will restore the HSM released file.
865         check_lpcc_state $file "none"
866         check_file_data $SINGLEAGT $file "ENOSPC_write"
867 }
868 run_test 8 "Test fake -ENOSPC tolerance for RW-PCC"
869
870 test_9() {
871         local loopfile="$TMP/$tfile"
872         local mntpt="/mnt/pcc.9a"
873         local hsm_root="$mntpt/$tdir"
874         local file=$DIR/$tfile
875
876         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
877
878         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMVER" -h "$hsm_root"
879         setup_pcc_mapping
880         do_facet $SINGLEAGT $LCTL pcc list $MOUNT
881
882         touch $file || error "touch $file failed"
883         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
884                 error "fail to attach $file"
885         check_lpcc_state $file "readwrite"
886         # write 60M data, it is larger than the capacity of PCC backend
887         do_facet $SINGLEAGT dd if=/dev/zero of=$file bs=1M count=60 ||
888                 error "fail to dd write $file"
889         check_lpcc_state $file "none"
890         check_file_size $SINGLEAGT $file 62914560
891 }
892 run_test 9 "Test -ENOSPC tolerance on loop PCC device for RW-PCC"
893
894 test_usrgrp_quota() {
895         local loopfile="$TMP/$tfile"
896         local mntpt="/mnt/pcc.$tdir"
897         local hsm_root="$mntpt/$tdir"
898         local ug=$1
899         local id=$RUNAS_ID
900
901         [[ $ug == "g" ]] && id=$RUNAS_GID
902
903         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
904         do_facet $SINGLEAGT quotacheck -c$ug $mntpt ||
905                 error "quotacheck -c$ug $mntpt failed"
906         do_facet $SINGLEAGT quotaon -$ug $mntpt ||
907                 error "quotaon -$ug $mntpt failed"
908         do_facet $SINGLEAGT setquota -$ug $id 0 20480 0 0 $mntpt ||
909                 error "setquota -$ug $id on $mntpt failed"
910         do_facet $SINGLEAGT repquota -${ug}vs $mntpt
911
912         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMVER" -h "$hsm_root"
913         setup_pcc_mapping
914         do_facet $SINGLEAGT $LCTL pcc list $MOUNT
915
916         mkdir $DIR/$tdir || error "mkdir $DIR/$tdir failed"
917
918         local file1=$DIR/$tdir/${ug}quotaA
919         local file2=$DIR/$tdir/${ug}quotaB
920
921         dd if=/dev/zero of=$file1 bs=1M count=15 ||
922                 error "dd write $file1 failed"
923         dd if=/dev/zero of=$file2 bs=1M count=15 ||
924                 error "dd write $file2 failed"
925         chown $RUNAS_ID:$RUNAS_GID $file1 ||
926                 error "chown $RUNAS_ID:$RUNAS_GID $file1 failed"
927         chown $RUNAS_ID:$RUNAS_GID $file2 ||
928                 error "chown $RUNAS_ID:$RUNAS_GID $file2 failed"
929         do_facet $SINGLEAGT $RUNAS $LFS pcc attach -i $HSM_ARCHIVE_NUMBER \
930                 $file1 || error "attach $file1 failed"
931         do_facet $SINGLEAGT $RUNAS $LFS pcc attach -i $HSM_ARCHIVE_NUMBER \
932                 $file2 && error "attach $file2 should fail due to quota limit"
933         check_lpcc_state $file1 "readwrite"
934         check_lpcc_state $file2 "none"
935
936         do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$file1 bs=1M count=30 ||
937                 error "dd write $file1 failed"
938         # -EDQUOT error should be tolerated via fallback to normal Lustre path.
939         check_lpcc_state $file1 "none"
940         do_facet $SINGLEAGT $LFS pcc detach -k $file1 ||
941                 error "failed to detach file $file"
942         rm $file1 $file2
943 }
944
945 test_10a() {
946         test_usrgrp_quota "u"
947 }
948 run_test 10a "Test RW-PCC with user quota on loop PCC device"
949
950 test_10b() {
951         test_usrgrp_quota "g"
952 }
953 run_test 10b "Test RW-PCC with group quota on loop PCC device"
954
955 test_11() {
956         local loopfile="$TMP/$tfile"
957         local mntpt="/mnt/pcc.$tdir"
958         local hsm_root="$mntpt/$tdir"
959         local file=$DIR/$tfile
960         local -a lpcc_path
961         local lpcc_dir
962
963         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
964         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
965         setup_pcc_mapping
966
967         do_facet $SINGLEAGT "echo -n QQQQQ > $file"
968         lpcc_path=$(lpcc_fid2path $hsm_root $file)
969         lpcc_dir=$(dirname $lpcc_path)
970         echo "Lustre file: $file LPCC dir: $lpcc_dir"
971         do_facet $SINGLEAGT mkdir -p $lpcc_dir ||
972                 error "mkdir -p $lpcc_dir failed"
973         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
974                 error "failed to attach $file"
975         check_lpcc_state $file "readwrite"
976         check_file_data $SINGLEAGT $file "QQQQQ"
977         do_facet $SINGLEAGT $LFS pcc detach -k $file ||
978                 error "failed to detach $file"
979         rm $file || error "rm $file failed"
980
981         # The parent directory of the PCC file is immutable
982         do_facet $SINGLEAGT "echo -n immutable_dir > $file"
983         lpcc_path=$(lpcc_fid2path $hsm_root $file)
984         lpcc_dir=$(dirname $lpcc_path)
985         echo "Lustre file: $file LPCC dir: $lpcc_dir"
986         do_facet $SINGLEAGT mkdir -p $lpcc_dir ||
987                 error "mkdir -p $lpcc_dir failed"
988         do_facet $SINGLEAGT chattr +i $lpcc_dir ||
989                 error "chattr +i $lpcc_dir failed"
990         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file &&
991                 error "attach $file with immutable directory should be failed"
992         do_facet $SINGLEAGT chattr -i $lpcc_dir ||
993                 error "chattr -i $lpcc_dir failed"
994         rm $file || error "rm $file failed"
995
996         # The PCC file path is set to a directory
997         do_facet $SINGLEAGT "echo -n pcc_file_path_is_dir > $file"
998         lpcc_path=$(lpcc_fid2path $hsm_root $file)
999         do_facet $SINGLEAGT mkdir -p $lpcc_path ||
1000                 error "mkdir -p $lpcc_path failed"
1001         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file &&
1002                 error "attach $file should fail as PCC path is a directory"
1003         rm $file || error "rm $file failed"
1004 }
1005 run_test 11 "Test attach fault injection with simulated PCC file path"
1006
1007 test_12() {
1008         local file=$DIR/$tfile
1009         local hsm_root=$(hsm_root)
1010         local -a lpcc_path
1011         local pid
1012
1013         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
1014         setup_pcc_mapping $SINGLEAGT \
1015                 "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0"
1016
1017         echo  -n race_rw_attach_hsmremove > $file
1018         lpcc_path=$(lpcc_fid2path $hsm_root $file)
1019         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
1020                 error "attach $file failed"
1021         do_facet $SINGLEAGT $LFS pcc detach -k $file ||
1022                 error "detach $file failed"
1023         # HSM released exists archived status
1024         check_hsm_flags $file "0x0000000d"
1025         # define OBD_FAIL_LLITE_PCC_ATTACH_PAUSE        0x1414
1026         do_facet $SINGLEAGT $LCTL set_param fail_loc=0x1414 fail_val=20
1027         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file &
1028         pid=$!
1029         $LFS hsm_state $file
1030         sleep 3
1031         wait_request_state $(path2fid $file) RESTORE SUCCEED
1032         $LFS hsm_remove $file || error "hsm remove $file failed"
1033         wait $pid && error "RW-PCC attach $file should fail"
1034         do_facet $SINGLEAGT "[ -f $lpcc_path ]" &&
1035                 error "RW-PCC cached file '$lpcc_path' should be removed"
1036
1037         return 0
1038 }
1039 run_test 12 "RW-PCC attach races with concurrent HSM remove"
1040
1041 test_rule_id() {
1042         local idstr="${1}id"
1043         local rule="${idstr}={$2}"
1044         local myRUNAS="$3"
1045         local file=$DIR/$tdir/$tfile
1046
1047         setup_pcc_mapping $SINGLEAGT \
1048                 "$rule\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0"
1049         $LCTL pcc list $MOUNT
1050
1051         do_facet $SINGLEAGT mkdir -p $DIR/$tdir
1052         chmod 777 $DIR/$tdir || error "chmod 0777 $DIR/$tdir failed"
1053
1054         rm -f $file || error "rm $file failed"
1055         do_facet $SINGLEAGT $myRUNAS dd if=/dev/zero of=$file bs=1024 count=1 ||
1056                 error "failed to dd write to $file"
1057         check_lpcc_state $file "readwrite"
1058         do_facet $SINGLEAGT $myRUNAS dd if=$file of=/dev/null bs=1024 count=1 ||
1059                 error "failed to dd read from $file"
1060         do_facet $SINGLEAGT $myRUNAS $TRUNCATE $file 256 ||
1061                 error "failed to truncate $file"
1062         do_facet $SINGLEAGT $myRUNAS $TRUNCATE $file 2048 ||
1063                 error "failed to truncate $file"
1064         do_facet $SINGLEAGT $myRUNAS dd if=/dev/zero of=$file bs=1024 count=1 ||
1065                 error "failed to dd write from $file"
1066         check_lpcc_state $file "readwrite"
1067
1068         do_facet $SINGLEAGT $myRUNAS $LFS pcc detach $file ||
1069                 error "failed to detach file $file"
1070         wait_request_state $(path2fid $file) REMOVE SUCCEED
1071         check_lpcc_state $file "none"
1072
1073         cleanup_pcc_mapping
1074 }
1075
1076 test_13a() {
1077         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
1078         test_rule_id "u" "500" "runas -u 500"
1079         test_rule_id "g" "500" "runas -u 500 -g 500"
1080 }
1081 run_test 13a "Test auto RW-PCC create caching for UID/GID rule"
1082
1083 test_13b() {
1084         local file
1085
1086         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
1087         setup_pcc_mapping $SINGLEAGT \
1088                 "fname={*.h5\ suffix.*\ Mid*dle}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0"
1089         $LCTL pcc list $MOUNT
1090
1091         do_facet $SINGLEAGT mkdir -p $DIR/$tdir
1092         chmod 777 $DIR/$tdir || error "chmod 0777 $DIR/$tdir failed"
1093
1094         file=$DIR/$tdir/prefix.h5
1095         do_facet $SINGLEAGT dd if=/dev/zero of=$file bs=1024 count=1 ||
1096                 error "failed to dd write to $file"
1097         check_lpcc_state $file "readwrite"
1098         do_facet $SINGLEAGT $myRUNAS $LFS pcc detach -k $file ||
1099                 error "failed to detach file $file"
1100         check_lpcc_state $file "none"
1101         rm $file || error "rm $file failed"
1102
1103         file=$DIR/$tdir/suffix.doc
1104         do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$file bs=1024 count=1 ||
1105                 error "failed to dd write to $file"
1106         check_lpcc_state $file "readwrite"
1107         do_facet $SINGLEAGT $myRUNAS $LFS pcc detach -k $file ||
1108                 error "failed to detach file $file"
1109         check_lpcc_state $file "none"
1110         rm $file || error "rm $file failed"
1111
1112         file=$DIR/$tdir/MidPADdle
1113         do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$file bs=1024 count=1 ||
1114                 error "failed to dd write to $file"
1115         check_lpcc_state $file "readwrite"
1116         do_facet $SINGLEAGT $myRUNAS $LFS pcc detach -k $file ||
1117                 error "failed to detach file $file"
1118         check_lpcc_state $file "none"
1119         rm $file || error "rm $file failed"
1120
1121         file=$DIR/$tdir/Midpad
1122         do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$file bs=1024 count=1 ||
1123                 error "failed to dd write to $file"
1124         check_lpcc_state $file "none"
1125         rm $file || error "rm $file failed"
1126 }
1127 run_test 13b "Test auto RW-PCC create caching for file name with wildcard"
1128
1129 test_13c() {
1130         local file
1131         local myRUNAS
1132         local loopfile="$TMP/$tfile"
1133         local mntpt="/mnt/pcc.$tdir"
1134         local hsm_root="$mntpt/$tdir"
1135
1136         ! is_project_quota_supported &&
1137                 echo "Skip project quota is not supported" && return 0
1138
1139         enable_project_quota
1140         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
1141         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
1142         setup_pcc_mapping $SINGLEAGT \
1143                 "projid={100\ 200}\&fname={*.h5},uid={500}\&gid={1000}\ rwid=$HSM_ARCHIVE_NUMBER"
1144         $LCTL pcc list $MOUNT
1145         do_facet $SINGLEAGT mkdir -p $DIR/$tdir
1146         chmod 777 $DIR/$tdir || error "chmod 0777 $DIR/$tdir failed"
1147
1148         mkdir -p $DIR/$tdir/proj || error "mkdir $DIR/$tdir/proj failed"
1149         mkdir -p $DIR/$tdir/proj2 || error "mkdir $DIR/$tdir/proj2 failed"
1150         $LFS project -sp 100 $DIR/$tdir/proj ||
1151                 error "failed to set project for $DIR/$tdir/proj"
1152         $LFS project -sp 200 $DIR/$tdir/proj2 ||
1153                 error "failed to set project for $DIR/$tdir/proj2"
1154
1155         file=$DIR/$tdir/proj/notcache
1156         do_facet $SINGLEAGT dd if=/dev/zero of=$file bs=1024 count=1 ||
1157                 error "failed to dd write to $file"
1158         check_lpcc_state $file "none"
1159         rm $file || error "rm $file failed"
1160
1161         file=$DIR/$tdir/proj/autocache.h5
1162         do_facet $SINGLEAGT dd if=/dev/zero of=$file bs=1024 count=1 ||
1163                 error "failed to dd write to $file"
1164         check_lpcc_state $file "readwrite"
1165         do_facet $SINGLEAGT $LFS pcc detach -k $file ||
1166                 error "failed to detach $file"
1167         rm $file || error "rm $file failed"
1168
1169         file=$DIR/$tdir/proj2/notcache
1170         do_facet $SINGLEAGT dd if=/dev/zero of=$file bs=1024 count=1 ||
1171                 error "failed to dd write to $file"
1172         check_lpcc_state $file "none"
1173         rm $file || error "rm $file failed"
1174
1175         file=$DIR/$tdir/proj2/autocache.h5
1176         do_facet $SINGLEAGT dd if=/dev/zero of=$file bs=1024 count=1 ||
1177                 error "failed to dd write to $file"
1178         check_lpcc_state $file "readwrite"
1179         do_facet $SINGLEAGT $LFS pcc detach -k $file ||
1180                 error "failed to detach $file"
1181         rm $file || error "rm $file failed"
1182
1183         file=$DIR/$tdir/ugidcache
1184         myRUNAS="runas -u 500 -g 1000"
1185         do_facet $SINGLEAGT $myRUNAS dd if=/dev/zero of=$file bs=1024 count=1 ||
1186                 error "failed to dd write to $file"
1187         check_lpcc_state $file "readwrite"
1188         do_facet $SINGLEAGT $LFS pcc detach -k $file ||
1189                 error "failed to detach $file"
1190         rm $file || error "rm $file failed"
1191 }
1192 run_test 13c "Check auto RW-PCC create caching for UID/GID/ProjID/fname rule"
1193
1194 test_14() {
1195         local file=$DIR/$tdir/$tfile
1196
1197         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
1198         setup_pcc_mapping $SINGLEAGT \
1199                 "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0"
1200
1201         mkdir -p $DIR/$tdir || error "mkdir -p $DIR/$tdir failed"
1202         do_facet $SINGLEAGT "echo -n autodetach_data > $file"
1203         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER \
1204                 $file || error "PCC attach $file failed"
1205         check_lpcc_state $file "readwrite"
1206
1207         # Revoke the layout lock, the PCC-cached file will be
1208         # detached automatically.
1209         do_facet $SINGLEAGT $LCTL \
1210                 set_param ldlm.namespaces.*mdc*.lru_size=clear
1211         check_file_data $SINGLEAGT $file "autodetach_data"
1212         check_lpcc_state $file "none"
1213 }
1214 run_test 14 "Revocation of the layout lock should detach the file automatically"
1215
1216 test_15() {
1217         local loopfile="$TMP/$tfile"
1218         local mntpt="/mnt/pcc.$tdir"
1219         local hsm_root="$mntpt/$tdir"
1220         local file=$DIR/$tdir/$tfile
1221
1222         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
1223         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
1224         setup_pcc_mapping
1225
1226         mkdir $DIR/$tdir || error "mkdir $DIR/$tdir failed"
1227         chmod 777 $DIR/$tdir || error "chmod 777 $DIR/$tdir failed"
1228
1229         echo "Check open attach for non-root user"
1230         do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$file bs=1024 count=1 ||
1231                 error "failed to dd write to $file"
1232         do_facet $SINGLEAGT $RUNAS $LFS pcc attach -i $HSM_ARCHIVE_NUMBER \
1233                 $file || error "failed to attach file $file"
1234         do_facet $SINGLEAGT $RUNAS $LFS pcc state $file
1235         check_lpcc_state $file "readwrite" $SINGLEAGT "$RUNAS"
1236         # Revoke the layout lock, the PCC-cached file will be
1237         # detached automatically.
1238         do_facet $SINGLEAGT $LCTL \
1239                 set_param ldlm.namespaces.*mdc*.lru_size=clear
1240         check_lpcc_state $file "readwrite" $SINGLEAGT "$RUNAS"
1241         # Detach the file but keep the cache , as the file layout generation
1242         # is not changed, so the file is still valid cached in PCC, and can
1243         # be reused from PCC cache directly.
1244         do_facet $SINGLEAGT $RUNAS $LFS pcc detach -k $file ||
1245                 error "PCC detach $file failed"
1246         check_lpcc_state $file "readwrite" $SINGLEAGT "$RUNAS"
1247         do_facet $SINGLEAGT $RUNAS $LFS pcc detach $file ||
1248                 error "PCC detach $file failed"
1249         rm $file || error "rm $file failed"
1250
1251         echo "check open attach for root user"
1252         do_facet $SINGLEAGT "echo -n autoattach_data > $file"
1253         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER \
1254                 $file || error "PCC attach $file failed"
1255         check_lpcc_state $file "readwrite"
1256
1257         # Revoke the layout lock, the PCC-cached file will be
1258         # detached automatically.
1259         do_facet $SINGLEAGT $LCTL \
1260                 set_param ldlm.namespaces.*mdc*.lru_size=clear
1261         check_file_data $SINGLEAGT $file "autoattach_data"
1262         check_lpcc_state $file "readwrite"
1263
1264         # Detach the file with -k option, as the file layout generation
1265         # is not changed, so the file is still valid cached in PCC,
1266         # and can be reused from PCC cache directly.
1267         do_facet $SINGLEAGT $LFS pcc detach -k $file ||
1268                 error "PCC detach $file failed"
1269         check_lpcc_state $file "readwrite"
1270         # HSM released exists archived status
1271         check_hsm_flags $file "0x0000000d"
1272         check_file_data $SINGLEAGT $file "autoattach_data"
1273
1274         # HSM restore the PCC cached file, the layout generation
1275         # was changed, so the file can not be auto attached.
1276         $LFS hsm_restore $file || error "failed to restore $file"
1277         wait_request_state $(path2fid $file) RESTORE SUCCEED
1278         check_lpcc_state $file "none"
1279         # HSM exists archived status
1280         check_hsm_flags $file "0x00000009"
1281
1282 }
1283 run_test 15 "Test auto attach at open when file is still valid cached"
1284
1285 test_16() {
1286         local loopfile="$TMP/$tfile"
1287         local mntpt="/mnt/pcc.$tdir"
1288         local hsm_root="$mntpt/$tdir"
1289         local file=$DIR/$tfile
1290         local -a lpcc_path
1291
1292         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
1293         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
1294         setup_pcc_mapping
1295
1296         do_facet $SINGLEAGT "echo -n detach_data > $file"
1297         lpcc_path=$(lpcc_fid2path $hsm_root $file)
1298         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER \
1299                 $file || error "PCC attach $file failed"
1300         check_lpcc_state $file "readwrite"
1301         # HSM released exists archived status
1302         check_hsm_flags $file "0x0000000d"
1303
1304         echo "Test for reusing valid PCC cache"
1305         # Valid PCC cache can be reused
1306         do_facet $SINGLEAGT $LFS pcc detach -k $file ||
1307                 error "PCC detach $file failed"
1308         check_lpcc_state $file "readwrite"
1309         # HSM released exists archived status
1310         check_hsm_flags $file "0x0000000d"
1311
1312         echo "Test for the default detach"
1313         # Permanent detach by default, it will remove the PCC copy
1314         do_facet $SINGLEAGT $LFS pcc detach $file ||
1315                 error "PCC detach $file failed"
1316         wait_request_state $(path2fid $file) REMOVE SUCCEED
1317         check_lpcc_state $file "none"
1318         # File is removed from PCC backend
1319         check_hsm_flags $file "0x00000000"
1320         do_facet $SINGLEAGT "[ -f $lpcc_path ]" &&
1321                 error "RW-PCC cached file '$lpcc_path' should be removed"
1322
1323         return 0
1324 }
1325 run_test 16 "Test detach with different options"
1326
1327 test_17() {
1328         local agt_host=$(facet_active_host $SINGLEAGT)
1329         local loopfile="$TMP/$tfile"
1330         local mntpt="/mnt/pcc.$tdir"
1331         local hsm_root="$mntpt/$tdir"
1332         local file=$DIR/$tfile
1333
1334         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
1335         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
1336         setup_pcc_mapping $SINGLEAGT \
1337                 "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ open_attach=0\ stat_attach=0"
1338
1339         do_facet $SINGLEAGT $LCTL pcc list $MOUNT
1340
1341         do_facet $SINGLEAGT "echo -n layout_refresh_data > $file"
1342         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
1343                 error "PCC attach $file failed"
1344         check_lpcc_state $file "readwrite"
1345
1346         do_facet $SINGLEAGT $LFS pcc detach -k $file ||
1347                 error "PCC detach $file failed"
1348         check_lpcc_state $file "none"
1349
1350         # Truncate should attach the file into PCC automatically
1351         # as the PCC copy is still valid.
1352         echo "Verify auto attach during IO for truncate"
1353         do_facet $SINGLEAGT $TRUNCATE $file 4 || error "truncate $file failed"
1354         check_lpcc_state $file "readwrite"
1355
1356         echo "Verify auto attach during IO for read/write"
1357         rmultiop_start $agt_host $file O_r || error "open $file failed"
1358         sleep 3
1359
1360         # Revoke the layout lock, the PCC-cached file will be
1361         # detached automatically.
1362         do_facet $SINGLEAGT $LCTL \
1363                 set_param ldlm.namespaces.*mdc*.lru_size=clear
1364
1365         check_lpcc_state $file "none"
1366         rmultiop_stop $agt_host || error "close $file failed"
1367         sleep 3
1368         check_lpcc_state $file "readwrite"
1369
1370         do_facet $SINGLEAGT $LFS pcc detach -k $file ||
1371                 error "PCC detach $file failed"
1372         check_lpcc_state $file "none"
1373 }
1374 run_test 17 "Test auto attach for layout refresh"
1375
1376 test_18() {
1377         local agt_host=$(facet_active_host $SINGLEAGT)
1378         local loopfile="$TMP/$tfile"
1379         local mntpt="/mnt/pcc.$tdir"
1380         local hsm_root="$mntpt/$tdir"
1381         local file=$DIR/$tfile
1382         local oldmd5
1383         local newmd5
1384
1385         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
1386         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
1387         setup_pcc_mapping $SINGLEAGT \
1388                 "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER"
1389
1390         do_facet $SINGLEAGT $LCTL pcc list $MOUNT
1391         do_facet $SINGLEAGT dd if=/dev/urandom of=$file bs=1M count=4 ||
1392                 error "failed to write $file"
1393         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
1394                 error "failed to attach $file"
1395         do_facet $SINGLEAGT $LFS pcc state $file
1396         check_lpcc_state $file "readwrite"
1397         do_facet $SINGLEAGT $LFS pcc detach --keep $file ||
1398                 error "failed to detach $file"
1399         do_facet $SINGLEAGT $LFS pcc state $file
1400         $CHECKSTAT -s 4194304 $file
1401         dd if=/dev/zero of=$DIR2/$tfile seek=1k bs=1k count=1 ||
1402                 error "failed to write $DIR2/$tfile"
1403         oldmd5=$(md5sum $DIR2/$tfile | awk '{print $1}')
1404         $CHECKSTAT -s 1049600 $DIR2/$tfile || error "$DIR2/$tfile size wrong"
1405
1406         local lpcc_path=$(lpcc_fid2path $hsm_root $file)
1407
1408         do_facet $SINGLEAGT $LFS pcc state $file
1409         check_file_size $SINGLEAGT $lpcc_path 4194304
1410         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
1411                 error "failed to attach $file"
1412         check_lpcc_sizes $SINGLEAGT $lpcc_path $file 1049600
1413         newmd5=$(do_facet $SINGLEAGT md5sum $file | awk '{print $1}')
1414         [ "$oldmd5" == "$newmd5" ] || error "md5sum differ: $oldmd5 != $newmd5"
1415         do_facet $SINGLEAGT $LFS pcc detach $file ||
1416                 error "failed to detach $file"
1417 }
1418 run_test 18 "Verify size correctness after re-attach the file"
1419
1420 test_19() {
1421         local agt_host=$(facet_active_host $SINGLEAGT)
1422         local loopfile="$TMP/$tfile"
1423         local mntpt="/mnt/pcc.$tdir"
1424         local hsm_root="$mntpt/$tdir"
1425         local file=$DIR/$tfile
1426
1427         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
1428         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
1429         setup_pcc_mapping $SINGLEAGT \
1430                 "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0"
1431
1432         do_facet $SINGLEAGT "echo -n QQQQQ > $file" || error "echo $file failed"
1433         lpcc_path=$(lpcc_fid2path $hsm_root $file)
1434         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
1435                 error "Failed to attach $file"
1436         check_lpcc_state $file "readwrite"
1437         check_lpcc_sizes $SINGLEAGT $file $lpcc_path 5
1438         do_facet $SINGLEAGT $LFS pcc detach --keep $file ||
1439                 error "Failed to detach $file"
1440         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
1441                 error "Failed to attach $file"
1442         check_lpcc_sizes $SINGLEAGT $file $lpcc_path 5
1443         do_facet $SINGLEAGT $LFS pcc detach --keep $file ||
1444                 error "Failed to detach $file"
1445 }
1446 run_test 19 "Verify the file re-attach works as expected"
1447
1448 test_20() {
1449         local agt_host=$(facet_active_host $SINGLEAGT)
1450         local loopfile="$TMP/$tfile"
1451         local mntpt="/mnt/pcc.$tdir"
1452         local hsm_root="$mntpt/$tdir"
1453         local file=$DIR/$tfile
1454
1455         setup_loopdev $SINGLEAGT $loopfile $mntpt 50
1456         copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
1457         setup_pcc_mapping $SINGLEAGT \
1458                 "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER"
1459
1460         do_facet $SINGLEAGT "echo -n QQQQQ > $file" ||
1461                 error "echo $file failed"
1462         do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file ||
1463                 error "Failed to attach $file"
1464         do_facet $SINGLEAGT "echo 3 > /proc/sys/vm/drop_caches"
1465         check_lpcc_state $file "readwrite"
1466         do_facet $SINGLEAGT "echo 3 > /proc/sys/vm/drop_caches"
1467         do_facet $SINGLEAGT "echo 3 > /proc/sys/vm/drop_caches"
1468         check_lpcc_state $file "readwrite"
1469         do_facet $SINGLEAGT $LFS pcc detach $file ||
1470                 error "Failed to detach $file"
1471 }
1472 run_test 20 "Auto attach works after the inode was once evicted from cache"
1473
1474 complete $SECONDS
1475 check_and_cleanup_lustre
1476 exit_status