diff --git a/lustre/llite/llite_internal.h b/lustre/llite/llite_internal.h index 9eb04f74cc6fea52721c46c5dc2ad0925a490a39..08f0cd14717be94dec0147afbd19411c5dd14db9 100644 --- a/lustre/llite/llite_internal.h +++ b/lustre/llite/llite_internal.h @@ -215,6 +215,7 @@ enum stats_track_type { #define LL_SBI_ACL 0x10 /* support ACL */ #define LL_SBI_JOIN 0x20 /* support JOIN */ #define LL_SBI_LOCALFLOCK 0x40 /* Local flocks support by kernel */ +#define LL_SBI_LRU_RESIZE 0x80 /* support lru resize */ /* default value for ll_sb_info->contention_time */ #define SBI_DEFAULT_CONTENTION_SECONDS 60 diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c index 3c2faa40bb7e9bb3a38d697f3abb5fffe72c603b..0ed511c8128ad340989e5d935106813ed96a577e 100644 --- a/lustre/llite/llite_lib.c +++ b/lustre/llite/llite_lib.c @@ -90,6 +90,10 @@ static struct ll_sb_info *ll_init_sbi(void) sbi->ll_flags |= LL_SBI_CHECKSUM; #endif +#ifdef HAVE_LRU_RESIZE_SUPPORT + sbi->ll_flags |= LL_SBI_LRU_RESIZE; +#endif + #ifdef HAVE_EXPORT___IGET INIT_LIST_HEAD(&sbi->ll_deathrow); spin_lock_init(&sbi->ll_deathrow_lock); @@ -163,7 +167,8 @@ static int client_common_fill_super(struct super_block *sb, OBD_CONNECT_JOIN | OBD_CONNECT_ATTRFID | OBD_CONNECT_NODEVOH | OBD_CONNECT_CANCELSET | OBD_CONNECT_AT; #ifdef HAVE_LRU_RESIZE_SUPPORT - data->ocd_connect_flags |= OBD_CONNECT_LRU_RESIZE; + if (sbi->ll_flags & LL_SBI_LRU_RESIZE) + data->ocd_connect_flags |= OBD_CONNECT_LRU_RESIZE; #endif #ifdef CONFIG_FS_POSIX_ACL data->ocd_connect_flags |= OBD_CONNECT_ACL; @@ -267,7 +272,8 @@ static int client_common_fill_super(struct super_block *sb, OBD_CONNECT_SRVLOCK | OBD_CONNECT_CANCELSET | OBD_CONNECT_AT; #ifdef HAVE_LRU_RESIZE_SUPPORT - data->ocd_connect_flags |= OBD_CONNECT_LRU_RESIZE; + if (sbi->ll_flags & LL_SBI_LRU_RESIZE) + data->ocd_connect_flags |= OBD_CONNECT_LRU_RESIZE; #endif CDEBUG(D_RPCTRACE, "ocd_connect_flags: "LPX64" ocd_version: %d " @@ -714,6 +720,16 @@ static int ll_options(char *options, int *flags) goto next; } + tmp = ll_set_opt("lruresize", s1, LL_SBI_LRU_RESIZE); + if (tmp) { + *flags |= tmp; + goto next; + } + tmp = ll_set_opt("nolruresize", s1, LL_SBI_LRU_RESIZE); + if (tmp) { + *flags &= ~tmp; + goto next; + } LCONSOLE_ERROR_MSG(0x152, "Unknown option '%s', won't mount.\n", s1); RETURN(-EINVAL); diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index f73cfac12c596171399dfcea4c5b7914db60629c..07f46ba2fd779bb64672260e10cffd1218a5eb06 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -3995,15 +3995,9 @@ lru_resize_disable() disable_pool "mds-$FSNAME" } -elc_test_init() -{ - [ -z "`grep early_lock_cancel $LPROC/mdc/*/connect_flags`" ] && \ - skip "no early lock cancel on server" && return 1 - return 0 -} - test_120a() { - elc_test_init || return 0 + [ -z "`grep early_lock_cancel $LPROC/mdc/*/connect_flags`" ] && \ + skip "no early lock cancel on server" && return 9 lru_resize_disable mkdir $DIR/$tdir cancel_lru_locks mdc @@ -4020,7 +4014,8 @@ test_120a() { run_test 120a "Early Lock Cancel: mkdir test ===================" test_120b() { - elc_test_init || return 0 + [ -z "`grep early_lock_cancel $LPROC/mdc/*/connect_flags`" ] && \ + skip "no early lock cancel on server" && return 9 lru_resize_disable mkdir $DIR/$tdir cancel_lru_locks mdc @@ -4037,7 +4032,8 @@ test_120b() { run_test 120b "Early Lock Cancel: create test ==================" test_120c() { - elc_test_init || return 0 + [ -z "`grep early_lock_cancel $LPROC/mdc/*/connect_flags`" ] && \ + skip "no early lock cancel on server" && return 9 lru_resize_disable mkdir -p $DIR/$tdir/d1 $DIR/$tdir/d2 touch $DIR/$tdir/d1/f1 @@ -4055,7 +4051,8 @@ test_120c() { run_test 120c "Early Lock Cancel: link test ====================" test_120d() { - elc_test_init || return 0 + [ -z "`grep early_lock_cancel $LPROC/mdc/*/connect_flags`" ] && \ + skip "no early lock cancel on server" && return 9 lru_resize_disable touch $DIR/$tdir cancel_lru_locks mdc @@ -4072,7 +4069,8 @@ test_120d() { run_test 120d "Early Lock Cancel: setattr test =================" test_120e() { - elc_test_init || return 0 + [ -z "`grep early_lock_cancel $LPROC/mdc/*/connect_flags`" ] && \ + skip "no early lock cancel on server" && return 9 lru_resize_disable mkdir $DIR/$tdir dd if=/dev/zero of=$DIR/$tdir/f1 count=1 @@ -4092,7 +4090,8 @@ test_120e() { run_test 120e "Early Lock Cancel: unlink test ==================" test_120f() { - elc_test_init || return 0 + [ -z "`grep early_lock_cancel $LPROC/mdc/*/connect_flags`" ] && \ + skip "no early lock cancel on server" && return 9 lru_resize_disable mkdir -p $DIR/$tdir/d1 $DIR/$tdir/d2 dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1 @@ -4114,7 +4113,8 @@ test_120f() { run_test 120f "Early Lock Cancel: rename test ==================" test_120g() { - elc_test_init || return 0 + [ -z "`grep early_lock_cancel $LPROC/mdc/*/connect_flags`" ] && \ + skip "no early lock cancel on server" && return 9 lru_resize_disable count=10000 echo create $count files @@ -4221,17 +4221,10 @@ test_123() # statahead(bug 11401) } run_test 123 "verify statahead work" -lru_resize_test_init() -{ - [ -z "`grep lru_resize $LPROC/mdc/*/connect_flags`" ] && \ - skip "no lru resize on server" && return 1 - return 0 -} - -test_124() { - lru_resize_test_init || return 0 - cleanup -f || error "failed to unmount" - setup +test_124a() { + [ -z "`grep lru_resize $LPROC/mdc/*/connect_flags`" ] && \ + skip "no lru resize on server" && return 0 + cancel_lru_locks mdc lru_resize_enable NSDIR=`find $LPROC/ldlm/namespaces | grep mdc | head -1` @@ -4241,7 +4234,7 @@ test_124() { disable_pool_shrink mdc NR=2000 - mkdir $DIR/$tdir + mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir" LRU_SIZE=`cat $NSDIR/lru_size` @@ -4250,6 +4243,11 @@ test_124() { for ((i=0;i<$NR;i++)); do touch $DIR/$tdir/f$i; done LRU_SIZE_B=`cat $NSDIR/lru_size` + if test $LRU_SIZE -ge $LRU_SIZE_B; then + skip "No cached locks created!" + cat $NSDIR/pool/state + return 0 + fi LRU_SIZE_B=$((LRU_SIZE_B-LRU_SIZE)) log "created $LRU_SIZE_B lock(s)" @@ -4268,8 +4266,7 @@ test_124() { # in the case of CMD, LRU_SIZE_B != $NR in most of cases LVF=$(($LIMIT * $MAX_HRS * 60 * 60 / $LRU_SIZE_B / $SLEEP)) - log "make client drop locks $LVF times faster so that ${SLEEP}s is \ -enough to cancel $LRU_SIZE_B lock(s)" + log "make client drop locks $LVF times faster so that ${SLEEP}s is enough to cancel $LRU_SIZE_B lock(s)" OLD_LVF=`cat $NSDIR/pool/lock_volume_factor` echo "$LVF" > $NSDIR/pool/lock_volume_factor log "sleep for "$((SLEEP+SLEEP_ADD))"s" @@ -4280,15 +4277,62 @@ enough to cancel $LRU_SIZE_B lock(s)" [ $LRU_SIZE_B -ge $LRU_SIZE_A ] || { error "No locks dropped in "$((SLEEP+SLEEP_ADD))"s. LRU size: $LRU_SIZE_A" lru_resize_enable + unlinkmany $DIR/$tdir/f $NR return } log "Dropped "$((LRU_SIZE_B-LRU_SIZE_A))" locks in "$((SLEEP+SLEEP_ADD))"s" lru_resize_enable log "unlink $NR files at $DIR/$tdir" - unlinkmany $DIR/$tdir/f $NR > /dev/null 2>&1 + unlinkmany $DIR/$tdir/f $NR +} +run_test 124a "lru resize =======================================" + +test_124b() { + [ -z "`grep lru_resize $LPROC/mdc/*/connect_flags`" ] && \ + skip "no lru resize on server" && return 0 + cleanup -f || error "failed to unmount" + MOUNTOPT="$MOUNTOPT,nolruresize" + setup + + NR=3000 + mkdir -p $DIR/$tdir || error "failed to create $DIR/$tdir" + + createmany -o $DIR/$tdir/f $NR + log "doing ls -la $DIR/$tdir 3 times (lru resize disabled)" + stime=`date +%s` + ls -la $DIR/$tdir > /dev/null + ls -la $DIR/$tdir > /dev/null + ls -la $DIR/$tdir > /dev/null + etime=`date +%s` + nolruresize_delta=$((etime-stime)) + log "ls -la time: $nolruresize_delta seconds" + + cleanup -f || error "failed to unmount" + MOUNTOPT=`echo $MOUNTOPT | sed "s/nolruresize/lruresize/"` + setup + + createmany -o $DIR/$tdir/f $NR + log "doing ls -la $DIR/$tdir 3 times (lru resize enabled)" + stime=`date +%s` + ls -la $DIR/$tdir > /dev/null + ls -la $DIR/$tdir > /dev/null + ls -la $DIR/$tdir > /dev/null + etime=`date +%s` + lruresize_delta=$((etime-stime)) + log "ls -la time: $lruresize_delta seconds" + + if test $lruresize_delta -gt $nolruresize_delta; then + log "ls -la is $((lruresize_delta - $nolruresize_delta))s slower with lru resize enabled" + elif test $nolruresize_delta -gt $lruresize_delta; then + log "ls -la is $((nolruresize_delta - $lruresize_delta))s faster with lru resize enabled" + else + log "lru resize performs the same with no lru resize" + fi + + unlinkmany $DIR/$tdir/f $NR } -run_test 124 "lru resize =======================================" +run_test 124b "lru resize (performance test) =======================" test_125() { # 13358 mkdir -p $DIR/d125 || error "mkdir failed"