From 03ab4771dfc6dafa8e6cd72509d8a6ac6c7046da Mon Sep 17 00:00:00 2001 From: Fan Yong Date: Wed, 2 Nov 2016 02:48:23 +0800 Subject: [PATCH] LU-9187 lfsck: handle parameters properly Currently, because of improper handling the parameters as to related parameters (such as "failout", "dryrun") only work for OI scrub, but do not work for namespace LFSCK and layout LFSCK. Signed-off-by: Fan Yong Change-Id: Ib38f7480758a59ba6a042948a8b49c36b401f100 Reviewed-on: https://review.whamcloud.com/25849 Tested-by: Jenkins Reviewed-by: Lai Siyao Tested-by: Maloo Reviewed-by: James Simmons Reviewed-by: Oleg Drokin --- lustre/lfsck/lfsck_bookmark.c | 44 +++++++++++++++++++++--------------------- lustre/lfsck/lfsck_layout.c | 3 ++- lustre/lfsck/lfsck_namespace.c | 3 ++- lustre/tests/sanity-lfsck.sh | 22 +++++++++++++++++++++ 4 files changed, 48 insertions(+), 24 deletions(-) diff --git a/lustre/lfsck/lfsck_bookmark.c b/lustre/lfsck/lfsck_bookmark.c index f3bdee7..76b6f11 100644 --- a/lustre/lfsck/lfsck_bookmark.c +++ b/lustre/lfsck/lfsck_bookmark.c @@ -263,9 +263,19 @@ int lfsck_set_param(const struct lu_env *env, struct lfsck_instance *lfsck, dirty = true; } + if ((bk->lb_param & LPF_OST_ORPHAN) && + !(start->ls_flags & LPF_OST_ORPHAN)) { + bk->lb_param &= ~LPF_OST_ORPHAN; + dirty = true; + } else if (!(bk->lb_param & LPF_OST_ORPHAN) && + (start->ls_flags & LPF_OST_ORPHAN)) { + bk->lb_param |= LPF_OST_ORPHAN; + dirty = true; + } + if ((start->ls_valid & LSV_CREATE_OSTOBJ) || reset) { if ((bk->lb_param & LPF_CREATE_OSTOBJ) && - !(start->ls_valid & LSV_CREATE_OSTOBJ)) { + !(start->ls_flags & LPF_CREATE_OSTOBJ)) { bk->lb_param &= ~LPF_CREATE_OSTOBJ; dirty = true; } else if (!(bk->lb_param & LPF_CREATE_OSTOBJ) && @@ -277,7 +287,7 @@ int lfsck_set_param(const struct lu_env *env, struct lfsck_instance *lfsck, if ((start->ls_valid & LSV_CREATE_MDTOBJ) || reset) { if ((bk->lb_param & LPF_CREATE_MDTOBJ) && - !(start->ls_valid & LSV_CREATE_MDTOBJ)) { + !(start->ls_flags & LPF_CREATE_MDTOBJ)) { bk->lb_param &= ~LPF_CREATE_MDTOBJ; dirty = true; } else if (!(bk->lb_param & LPF_CREATE_MDTOBJ) && @@ -289,7 +299,7 @@ int lfsck_set_param(const struct lu_env *env, struct lfsck_instance *lfsck, if ((start->ls_valid & LSV_DELAY_CREATE_OSTOBJ) || reset) { if ((bk->lb_param & LPF_DELAY_CREATE_OSTOBJ) && - !(start->ls_valid & LSV_DELAY_CREATE_OSTOBJ)) { + !(start->ls_flags & LPF_DELAY_CREATE_OSTOBJ)) { bk->lb_param &= ~LPF_DELAY_CREATE_OSTOBJ; dirty = true; } else if (!(bk->lb_param & LPF_DELAY_CREATE_OSTOBJ) && @@ -301,39 +311,29 @@ int lfsck_set_param(const struct lu_env *env, struct lfsck_instance *lfsck, if ((start->ls_valid & LSV_ERROR_HANDLE) || reset) { if ((bk->lb_param & LPF_FAILOUT) && - !(start->ls_valid & LSV_ERROR_HANDLE)) { + !(start->ls_flags & LPF_FAILOUT)) { bk->lb_param &= ~LPF_FAILOUT; dirty = true; - } else if (!(start->ls_flags & LPF_FAILOUT) && - (bk->lb_param & LPF_FAILOUT)) { - bk->lb_param &= ~LPF_FAILOUT; + } else if (!(bk->lb_param & LPF_FAILOUT) && + (start->ls_flags & LPF_FAILOUT)) { + bk->lb_param |= LPF_FAILOUT; dirty = true; } } if ((start->ls_valid & LSV_DRYRUN) || reset) { if ((bk->lb_param & LPF_DRYRUN) && - !(start->ls_valid & LSV_DRYRUN)) { - bk->lb_param &= ~LPF_DRYRUN; - dirty = true; - } else if (!(start->ls_flags & LPF_DRYRUN) && - (bk->lb_param & LPF_DRYRUN)) { + !(start->ls_flags & LPF_DRYRUN)) { bk->lb_param &= ~LPF_DRYRUN; lfsck->li_drop_dryrun = 1; dirty = true; + } else if (!(bk->lb_param & LPF_DRYRUN) && + (start->ls_flags & LPF_DRYRUN)) { + bk->lb_param |= LPF_DRYRUN; + dirty = true; } } - if ((bk->lb_param & LPF_OST_ORPHAN) && - !(start->ls_flags & LPF_OST_ORPHAN)) { - bk->lb_param &= ~LPF_OST_ORPHAN; - dirty = true; - } else if (!(bk->lb_param & LPF_OST_ORPHAN) && - (start->ls_flags & LPF_OST_ORPHAN)) { - bk->lb_param |= LPF_OST_ORPHAN; - dirty = true; - } - if (start->ls_valid & LSV_SPEED_LIMIT) { if (__lfsck_set_speed(lfsck, start->ls_speed_limit)) dirty = true; diff --git a/lustre/lfsck/lfsck_layout.c b/lustre/lfsck/lfsck_layout.c index c355539..4773b81 100644 --- a/lustre/lfsck/lfsck_layout.c +++ b/lustre/lfsck/lfsck_layout.c @@ -1459,8 +1459,9 @@ static int lfsck_layout_double_scan_result(const struct lu_env *env, lo->ll_status = LS_COMPLETED; } } + lo->ll_flags &= ~LF_SCANNED_ONCE; if (!(lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)) - lo->ll_flags &= ~(LF_SCANNED_ONCE | LF_INCONSISTENT); + lo->ll_flags &= ~LF_INCONSISTENT; lo->ll_time_last_complete = lo->ll_time_last_checkpoint; lo->ll_success_count++; } else if (rc == 0) { diff --git a/lustre/lfsck/lfsck_namespace.c b/lustre/lfsck/lfsck_namespace.c index 91a82bc..5a09bdc 100644 --- a/lustre/lfsck/lfsck_namespace.c +++ b/lustre/lfsck/lfsck_namespace.c @@ -6271,8 +6271,9 @@ static int lfsck_namespace_double_scan_result(const struct lu_env *env, ns->ln_status = LS_PARTIAL; else ns->ln_status = LS_COMPLETED; + ns->ln_flags &= ~LF_SCANNED_ONCE; if (!(lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)) - ns->ln_flags &= ~(LF_SCANNED_ONCE | LF_INCONSISTENT); + ns->ln_flags &= ~LF_INCONSISTENT; ns->ln_time_last_complete = ns->ln_time_last_checkpoint; ns->ln_success_count++; } else if (rc == 0) { diff --git a/lustre/tests/sanity-lfsck.sh b/lustre/tests/sanity-lfsck.sh index d1dcc90..17746c5 100644 --- a/lustre/tests/sanity-lfsck.sh +++ b/lustre/tests/sanity-lfsck.sh @@ -5029,6 +5029,28 @@ test_32() } run_test 32 "stop LFSCK when some OST failed" +test_33() +{ + lfsck_prep 5 5 + + $START_LAYOUT --dryrun -o -r || + error "(1) Fail to start layout LFSCK" + wait_all_targets_blocked layout completed 2 + + local PARAMS=$($SHOW_LAYOUT | awk '/^param/ { print $2 }') + [ "$PARAMS" == "dryrun,all_targets,orphan" ] || + error "(3) Expect 'dryrun,all_targets,orphan', got '$PARAMS'" + + $START_NAMESPACE -e abort -A -r || + error "(4) Fail to start namespace LFSCK" + wait_all_targets_blocked namespace completed 5 + + PARAMS=$($SHOW_NAMESPACE | awk '/^param/ { print $2 }') + [ "$PARAMS" == "failout,all_targets" ] || + error "(6) Expect 'failout,all_targets', got '$PARAMS'" +} +run_test 33 "check LFSCK paramters" + # restore MDS/OST size MDSSIZE=${SAVED_MDSSIZE} OSTSIZE=${SAVED_OSTSIZE} -- 1.8.3.1