From b7121b2fea17af5bc327df721af3348b3c97e413 Mon Sep 17 00:00:00 2001 From: fanyong Date: Sat, 6 Dec 2008 03:28:06 +0000 Subject: [PATCH] Branch HEAD b=15691 i=h.huang i=johann If there are too many locks on client-side, then some locks taken by statahead maybe dropped automatically before the real "revalidate" using them. Under such case the statahead should fail. --- lustre/llite/dcache.c | 7 +++++-- lustre/tests/sanity.sh | 5 +++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lustre/llite/dcache.c b/lustre/llite/dcache.c index 95e0694..bafb293 100644 --- a/lustre/llite/dcache.c +++ b/lustre/llite/dcache.c @@ -477,7 +477,10 @@ do_lock: it->it_flags &= ~O_CHECK_STALE; ll_finish_md_op_data(op_data); 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); @@ -614,7 +617,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 8e2fd53..c4c4d95 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -5088,6 +5088,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 @@ -5097,6 +5098,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 @@ -5110,6 +5112,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 -- 1.8.3.1