diff --git a/lustre/llite/dcache.c b/lustre/llite/dcache.c index 26a152a6696ade683f717a8f85dbf8238bde1a1d..c0989f2e3c32b5e4680ff84ad6f44c731ee92617 100644 --- a/lustre/llite/dcache.c +++ b/lustre/llite/dcache.c @@ -453,7 +453,10 @@ do_lock: rc = mdc_intent_lock(exp, &op_data, NULL, 0, it, lookup_flags, &req, ll_mdc_blocking_ast, 0); if (it->it_op == IT_GETATTR && !first) - ll_statahead_exit(de, rc); + /* If there are too many locks on client-side, then some + * locks taken by statahead maybe dropped automatically + * before the real "revalidate" using them. */ + ll_statahead_exit(de, req == NULL ? rc : 0); else if (first == -EEXIST) ll_statahead_mark(de); @@ -578,7 +581,7 @@ out_sa: if (it && it->it_op == IT_GETATTR && rc == 1) { first = ll_statahead_enter(de->d_parent->d_inode, &de, 0); if (!first) - ll_statahead_exit(de, rc); + ll_statahead_exit(de, 1); else if (first == -EEXIST) ll_statahead_mark(de); } diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 072d25cee66fdb6024c0a4ccf285284b298e066c..fad85859df68c5ecdcff091f8a3b321388c796ba 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -4941,6 +4941,7 @@ test_123a() { # was test 123, statahead(bug 11401) for ((i=1, j=0; i<=$NUMFREE; j=$i, i=$((i * MULT)) )); do createmany -o $DIR/$tdir/$tfile $j $((i - j)) + swrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'` lctl get_param -n llite.*.statahead_max | grep '[0-9]' cancel_lru_locks mdc cancel_lru_locks osc @@ -4950,6 +4951,7 @@ test_123a() { # was test 123, statahead(bug 11401) delta_sa=$((etime - stime)) log "ls $i files with statahead: $delta_sa sec" lctl get_param -n llite.*.statahead_stats + ewrong=`lctl get_param -n llite.*.statahead_stats | grep "statahead wrong:" | awk '{print $3}'` max=`lctl get_param -n llite.*.statahead_max | head -n 1` lctl set_param -n llite.*.statahead_max 0 @@ -4963,6 +4965,9 @@ test_123a() { # was test 123, statahead(bug 11401) log "ls $i files without statahead: $delta sec" lctl set_param llite.*.statahead_max=$max + if [ $swrong -lt $ewrong ]; then + log "statahead was stopped, maybe too many locks held!" + fi if [ $delta_sa -gt $(($delta + 2)) ]; then log "ls $i files is slower with statahead!" error=1