From 4bd9b524537bce27fb7f53cf481b78290cd55a1d Mon Sep 17 00:00:00 2001 From: Andreas Dilger Date: Wed, 15 Sep 2021 17:30:23 -0600 Subject: [PATCH] LU-15011 lod: count all spilling events when target pool is used to as the original has no enough space. lctl lod.*.pool..spill_hit can be used to get the counter. Signed-off-by: Alex Zhuravlev Change-Id: I6d54a2b910705da182b5f4118e535d196cdab004 Reviewed-on: https://review.whamcloud.com/44947 Tested-by: jenkins Tested-by: Maloo Reviewed-by: John L. Hammond Reviewed-by: Oleg Drokin --- lustre/lod/lod_internal.h | 1 + lustre/lod/lod_pool.c | 2 ++ lustre/lod/lproc_lod.c | 12 ++++++++++++ lustre/tests/ost-pools.sh | 31 +++++++++++++++++++------------ 4 files changed, 34 insertions(+), 12 deletions(-) diff --git a/lustre/lod/lod_internal.h b/lustre/lod/lod_internal.h index 4d8a0ed..dc5c243 100644 --- a/lustre/lod/lod_internal.h +++ b/lustre/lod/lod_internal.h @@ -67,6 +67,7 @@ struct pool_desc { struct proc_dir_entry *pool_spill_proc_entry; bool pool_spill_is_active; unsigned int pool_spill_threshold_pct; + atomic_t pool_spill_hit; char pool_spill_target[LOV_MAXPOOLNAME + 1]; }; diff --git a/lustre/lod/lod_pool.c b/lustre/lod/lod_pool.c index 30bebf7..35e0601 100644 --- a/lustre/lod/lod_pool.c +++ b/lustre/lod/lod_pool.c @@ -435,6 +435,7 @@ int lod_pool_new(struct obd_device *obd, char *poolname) new_pool->pool_spill_is_active = false; new_pool->pool_spill_threshold_pct = 0; new_pool->pool_spill_target[0] = '\0'; + atomic_set(&new_pool->pool_spill_hit, 0); new_pool->pool_lobd = obd; atomic_set(&new_pool->pool_refcount, 1); rc = lu_tgt_pool_init(&new_pool->pool_obds, 0); @@ -803,6 +804,7 @@ repeat: lod2obd(lod)->obd_name, LOD_SPILL_MAX, *poolname, pool->pool_spill_target); lod_set_pool(poolname, pool->pool_spill_target); + atomic_inc(&pool->pool_spill_hit); lod_pool_putref(pool); if (replaced >= LOD_SPILL_MAX) return; diff --git a/lustre/lod/lproc_lod.c b/lustre/lod/lproc_lod.c index 354fb6a..f984bbd 100644 --- a/lustre/lod/lproc_lod.c +++ b/lustre/lod/lproc_lod.c @@ -1140,6 +1140,16 @@ static int lod_spill_is_active_seq_show(struct seq_file *m, void *v) } LPROC_SEQ_FOPS_RO(lod_spill_is_active); +static int lod_spill_hit_seq_show(struct seq_file *m, void *v) +{ + struct pool_desc *pool = m->private; + + LASSERT(pool != NULL); + seq_printf(m, "%d\n", atomic_read(&pool->pool_spill_hit)); + return 0; +} +LPROC_SEQ_FOPS_RO(lod_spill_hit); + struct lprocfs_vars lprocfs_lod_spill_vars[] = { { .name = "spill_threshold_pct", .fops = &lod_spill_threshold_pct_fops }, @@ -1147,6 +1157,8 @@ struct lprocfs_vars lprocfs_lod_spill_vars[] = { .fops = &lod_spill_target_fops }, { .name = "spill_is_active", .fops = &lod_spill_is_active_fops }, + { .name = "spill_hit", + .fops = &lod_spill_hit_fops }, { NULL } }; diff --git a/lustre/tests/ost-pools.sh b/lustre/tests/ost-pools.sh index 6ffda0e..217a8a9 100755 --- a/lustre/tests/ost-pools.sh +++ b/lustre/tests/ost-pools.sh @@ -1614,17 +1614,18 @@ function fill_ost_pool() { test_29() { local pool1=${TESTNAME}-1 local pool2=${TESTNAME}-2 - local mdts=$(comma_list $(mdts_nodes)) local threshold=10 - local prefix="lod.$FSNAME-MDT*.pool.$pool1" + local prefix="lod.$FSNAME-MDT0000*.pool.$pool1" local cmd="$LCTL get_param -n $prefix" + local before + local after (( $MDS1_VERSION >= $(version_code 2.14.53) )) || skip "Need MDS version at least 2.14.53" (( $OSTCOUNT >= 4 )) || skip "needs >= 4 OSTs" check_set_fallocate_or_skip - mkdir -p $DIR/$tdir + mkdir_on_mdt0 $DIR/$tdir stack_trap "rm -rf $DIR/$tdir" pool_add $pool1 || error "Pool creation failed" @@ -1633,14 +1634,15 @@ test_29() { pool_add $pool2 || error "Pool creation failed" pool_add_targets $pool2 2 3 || error "pool_add_targets failed" - do_nodes $mdts $LCTL set_param $prefix.spill_target=$pool2 - do_nodes $mdts $LCTL set_param $prefix.spill_threshold_pct=$threshold - stack_trap "do_nodes $mdts $LCTL set_param $prefix.spill_threshold_pct=0" + do_facet mds1 $LCTL set_param $prefix.spill_target=$pool2 + do_facet mds1 $LCTL set_param $prefix.spill_threshold_pct=$threshold + stack_trap "do_facet mds1 $LCTL set_param $prefix.spill_threshold_pct=0" - [[ $(do_facet mds1 "$cmd.spill_target" | uniq) == "$pool2" ]] || + [[ $(do_facet mds1 "$cmd.spill_target") == "$pool2" ]] || error "spill target wasn't set" - [[ $(do_facet mds1 "$cmd.spill_threshold_pct" | uniq) == "$threshold" ]] || + [[ $(do_facet mds1 "$cmd.spill_threshold_pct") == "$threshold" ]] || error "spill threshold wasn't set" + before=$(do_facet mds1 "$cmd.spill_hit") lfs_df -p $pool1 | grep summary fill_ost_pool $pool1 $threshold cancel_lru_locks osc @@ -1656,6 +1658,9 @@ test_29() { $LFS getstripe $DIR/$tdir/$tfile-2 error "old pool on $tfile-2" } + after=$(do_facet mds1 "$cmd.spill_hit") + (( after == before + 1 )) || error "after $after != before $before + 1" + # when striping is specified explicitly $LFS setstripe -p $pool1 $DIR/$tdir/$tfile-3 || error "can't setstripe" touch $DIR/$tdir/$tfile-3 @@ -1663,9 +1668,11 @@ test_29() { $LFS getstripe $DIR/$tdir/$tfile-3 error "old pool on $tfile-3" } + after=$(do_facet mds1 "$cmd.spill_hit") + (( after == before + 2 )) || error "after $after != before $before + 2" # spill is revalidated at object creation - wait_update_facet mds1 "$cmd.spill_is_active | uniq" "1" || + wait_update_facet mds1 "$cmd.spill_is_active" "1" || error "spilling is still inactive" rm -f $DIR/$tdir/$tfile* || error "can't rm $DIR/$tfile*" @@ -1679,11 +1686,11 @@ test_29() { error "new pool != $pool1" } # spill is revaluated at object creation - wait_update_facet mds1 "$cmd.spill_is_active | uniq" "0" || + wait_update_facet mds1 "$cmd.spill_is_active" "0" || error "spilling is still active" - do_nodes $mdts $LCTL set_param $prefix.spill_threshold_pct=0 - [[ $(do_facet mds1 "$cmd.spill_threshold_pct" | uniq) == "0" ]] || + do_facet mds1 "$LCTL set_param $prefix.spill_threshold_pct=0" + [[ $(do_facet mds1 "$cmd.spill_threshold_pct") == "0" ]] || error "spill threshold wasn't reset" } run_test 29 "check OST pool spilling" -- 1.8.3.1