LPROC_LL_FALLOCATE,
LPROC_LL_INODE_OCOUNT,
LPROC_LL_INODE_OPCLTM,
+ LPROC_LL_PCC_ATTACH,
+ LPROC_LL_PCC_DETACH,
+ LPROC_LL_PCC_AUTOAT,
LPROC_LL_HYBRID_NOSWITCH,
LPROC_LL_HYBRID_WRITESIZE_SWITCH,
LPROC_LL_HYBRID_READSIZE_SWITCH,
{ LPROC_LL_LISTXATTR, LPROCFS_TYPE_LATENCY, "listxattr" },
{ LPROC_LL_REMOVEXATTR, LPROCFS_TYPE_LATENCY, "removexattr" },
{ LPROC_LL_INODE_PERM, LPROCFS_TYPE_LATENCY, "inode_permission" },
+ /* PCC I/O statistics */
+ { LPROC_LL_PCC_ATTACH, LPROCFS_TYPE_REQS, "pcc_attach" },
+ { LPROC_LL_PCC_DETACH, LPROCFS_TYPE_REQS, "pcc_detach" },
+ { LPROC_LL_PCC_AUTOAT, LPROCFS_TYPE_REQS, "pcc_auto_attach" },
/* hybrid IO switch from buffered I/O (BIO) to direct I/O (DIO) */
{ LPROC_LL_HYBRID_NOSWITCH, LPROCFS_TYPE_REQS, "hybrid_noswitch" },
{ LPROC_LL_HYBRID_WRITESIZE_SWITCH, LPROCFS_TYPE_REQS,
pcci = ll_i2pcci(inode);
if (pcci && pcc_inode_has_layout(pcci))
*cached = true;
+
if (rc) {
CDEBUG(D_CACHE,
"Failed to try PCC-RO attach "DFID", rc = %d\n",
LU_PCC_READONLY, cached);
}
+ if (*cached)
+ ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_PCC_AUTOAT, 1);
+
RETURN(rc);
}
pcci->pcci_type = LU_PCC_NONE;
pcc_layout_gen_set(pcci, CL_LAYOUT_GEN_NONE);
pcc_inode_mapping_reset(inode);
+ ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_PCC_DETACH, 1);
}
static inline void pcc_inode_detach_put(struct inode *inode)
pcc_inode_detach_put(inode);
}
pcc_inode_unlock(inode);
-
EXIT;
}
PFID(ll_inode2fid(inode)), vma, i_size_read(inode),
vma->vm_end - vma->vm_start, vma->vm_pgoff,
vma->vm_flags);
- } else {
- *cached = false;
}
out:
pcc_inode_unlock(inode);
(void) pcc_inode_remove(inode, dentry);
revert_creds(old_cred);
dput(dentry);
+ } else {
+ ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_PCC_ATTACH, 1);
}
out_dataset_put:
pcc_dataset_put(dataset);
RETURN(rc);
rc = ll_layout_refresh(inode, gen);
- if (rc)
- RETURN(rc);
} else { /* Readonly layout */
struct pcc_inode *pcci;
rc = pcc_try_datasets_attach(inode, PIT_OPEN, *gen,
LU_PCC_READONLY, cached);
pcc_inode_unlock(inode);
+ if (*cached)
+ ll_stats_ops_tally(ll_i2sbi(inode),
+ LPROC_LL_PCC_AUTOAT, 1);
}
RETURN(rc);
pcc_inode_put(pcci);
else
dput(dentry);
+ } else {
+ ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_PCC_ATTACH, 1);
}
revert_creds(old_cred);
pcc_inode_unlock(inode);
}
run_test 42 "PCC attach without attach ID specified"
+test_44() {
+ local loopfile="$TMP/$tfile"
+ local mntpt="/mnt/pcc.$tdir"
+ local hsm_root="$mntpt/$tdir"
+ local file=$DIR/$tfile
+ local count=50
+ local bs="1M"
+
+ $LCTL get_param -n mdc.*.connect_flags | grep -q pcc_ro ||
+ skip "Server does not support PCC-RO"
+
+ setup_loopdev client $loopfile $mntpt 60
+ mkdir $hsm_root || error "mkdir $hsm_root failed"
+ setup_pcc_mapping client \
+ "projid={0}\ roid=$HSM_ARCHIVE_NUMBER\ ropcc=1\ mmap_conv=0"
+ $LCTL pcc list $MOUNT
+ $LCTL set_param llite.*.pcc_async_threshold=1G
+
+ dd if=/dev/zero of=$file bs=$bs count=$count ||
+ error "Write $file failed"
+
+ local n=16
+ local lpid
+ local -a rpids
+
+ $LFS getstripe -v $file
+ clear_stats llite.*.stats
+
+ for ((i = 0; i < $n; i++)); do
+ (
+ while [ ! -e $DIR/$tfile.lck ]; do
+ dd if=$file of=/dev/null bs=$bs count=$count ||
+ error "Read $file failed"
+ sleep 0.$((RANDOM % 4 + 1))
+ done
+ )&
+ rpids[$i]=$!
+ done
+
+ (
+ while [ ! -e $DIR/$tfile.lck ]; do
+ $LCTL set_param -n ldlm.namespaces.*mdc*.lru_size=clear ||
+ error "cancel_lru_locks mdc failed"
+ sleep 0.2
+ done
+ )&
+ lpid=$!
+
+ sleep 60
+ touch $DIR/$tfile.lck
+
+ for ((i = 0; i < $n; i++)); do
+ wait ${rpids[$i]} || error "$?: read failed"
+ done
+ wait $lpid || error "$?: lock cancel failed"
+
+ echo "Finish ========"
+ $LFS getstripe -v $file
+ $LCTL get_param llite.*.stats
+
+ local attach_num=$(calc_stats llite.*.stats pcc_attach)
+ local detach_num=$(calc_stats llite.*.stats pcc_detach)
+ local autoat_num=$(calc_stats llite.*.stats pcc_auto_attach)
+
+ echo "attach $attach_num detach $detach_num auto_attach $autoat_num"
+ (( $attach_num <= 1 )) || error "attach more than 1 time: $attach_num"
+ rm -f $DIR/$tfile.lck
+}
+run_test 44 "Verify valid auto attach without re-fetching the whole files"
+
test_96() {
local loopfile="$TMP/$tfile"
local mntpt="/mnt/pcc.$tdir"
setup_pcc_mapping $SINGLEAGT \
"projid={0}\ roid=$HSM_ARCHIVE_NUMBER\ pccro=1\ mmap_conv=0"
do_facet $SINGLEAGT $LCTL pcc list $MOUNT
- do_facet $SINGLEAGT $LCTL set_param llite.*.pcc_async_threshold=1G
+ do_facet $SINGLEAGT $LCTL set_param llite.*.pcc_async_threshold=0
local rpid1
local rpid2