From 445da16c2ac0475b1c1077c822800b68cdbb7ce3 Mon Sep 17 00:00:00 2001 From: Fan Yong Date: Sun, 17 Jul 2016 05:42:03 +0800 Subject: [PATCH] LU-8569 lfsck: cleanup lfsck requests list before exit When the lfsck assistant thread hits some failure and exit at the second stage scanning, it does not cleanup the requests list 'lfsck_assistant_data::lad_req_list', that may cause the lfsck main engine hit "LASSERT(list_empty(&lad->lad_req_list))" when handles double scan. This patch unifies the assistant thread exit process: before cleanup the list 'lfsck_assistant_data::lad_req_list' set the thread as "stopping" to prevent more lfsck requests being added, then cleanup the list 'lfsck_assistant_data::lad_req_list'. Signed-off-by: Fan Yong Change-Id: I7facd20e2742c7ad5d4fbee1c975dacd8f6ea363 Reviewed-on: http://review.whamcloud.com/22723 Tested-by: Jenkins Reviewed-by: Andreas Dilger Tested-by: Maloo Reviewed-by: Lai Siyao Reviewed-by: Oleg Drokin --- lustre/lfsck/lfsck_engine.c | 24 ++++++++++++------------ lustre/lfsck/lfsck_layout.c | 4 ++++ lustre/lfsck/lfsck_namespace.c | 4 ++++ 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/lustre/lfsck/lfsck_engine.c b/lustre/lfsck/lfsck_engine.c index 97d0427..f5b5e70 100644 --- a/lustre/lfsck/lfsck_engine.c +++ b/lustre/lfsck/lfsck_engine.c @@ -1597,7 +1597,7 @@ int lfsck_assistant_engine(void *args) if (unlikely(lad->lad_exit || !thread_is_running(mthread))) - GOTO(cleanup1, rc = lad->lad_post_result); + GOTO(cleanup, rc = lad->lad_post_result); lar = list_entry(lad->lad_req_list.next, struct lfsck_assistant_req, @@ -1622,7 +1622,7 @@ int lfsck_assistant_engine(void *args) lao->la_req_fini(env, lar); if (rc < 0 && bk->lb_param & LPF_FAILOUT) - GOTO(cleanup1, rc); + GOTO(cleanup, rc); } l_wait_event(athread->t_ctl_waitq, @@ -1633,7 +1633,7 @@ int lfsck_assistant_engine(void *args) &lwi); if (unlikely(lad->lad_exit)) - GOTO(cleanup1, rc = lad->lad_post_result); + GOTO(cleanup, rc = lad->lad_post_result); if (!list_empty(&lad->lad_req_list)) continue; @@ -1643,7 +1643,7 @@ int lfsck_assistant_engine(void *args) lfsck_lfsck2name(lfsck), lad->lad_name); if (unlikely(lad->lad_exit)) - GOTO(cleanup1, rc = lad->lad_post_result); + GOTO(cleanup, rc = lad->lad_post_result); lad->lad_to_post = 0; LASSERT(lad->lad_post_result > 0); @@ -1687,7 +1687,7 @@ int lfsck_assistant_engine(void *args) lfsck_lfsck2name(lfsck), rc2); if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_NO_DOUBLESCAN)) - GOTO(cleanup2, rc = 0); + GOTO(cleanup, rc = 0); while (lad->lad_in_double_scan) { rc = lfsck_assistant_query_others(env, com); @@ -1695,7 +1695,7 @@ int lfsck_assistant_engine(void *args) goto p2_next; if (rc < 0) - GOTO(cleanup2, rc); + GOTO(cleanup, rc); /* Pull LFSCK status on related targets once * per 30 seconds if we are not notified. */ @@ -1710,27 +1710,27 @@ int lfsck_assistant_engine(void *args) if (unlikely(lad->lad_exit || !thread_is_running(mthread))) - GOTO(cleanup2, rc = 0); + GOTO(cleanup, rc = 0); if (rc == -ETIMEDOUT) continue; if (rc < 0) - GOTO(cleanup2, rc); + GOTO(cleanup, rc); p2_next: rc = lao->la_handler_p2(env, com); if (rc != 0) - GOTO(cleanup2, rc); + GOTO(cleanup, rc); if (unlikely(lad->lad_exit || !thread_is_running(mthread))) - GOTO(cleanup2, rc = 0); + GOTO(cleanup, rc = 0); } } } -cleanup1: +cleanup: /* Cleanup the unfinished requests. */ spin_lock(&lad->lad_lock); if (rc < 0) @@ -1739,6 +1739,7 @@ cleanup1: if (lad->lad_exit && lad->lad_post_result <= 0) lao->la_fill_pos(env, com, &lfsck->li_pos_checkpoint); + thread_set_flags(athread, SVC_STOPPING); while (!list_empty(&lad->lad_req_list)) { lar = list_entry(lad->lad_req_list.next, struct lfsck_assistant_req, @@ -1754,7 +1755,6 @@ cleanup1: LASSERTF(lad->lad_prefetched == 0, "unmatched prefeteched objs %d\n", lad->lad_prefetched); -cleanup2: memset(lr, 0, sizeof(*lr)); if (rc > 0) { lr->lr_event = LE_PHASE2_DONE; diff --git a/lustre/lfsck/lfsck_layout.c b/lustre/lfsck/lfsck_layout.c index 06fb33c..d1cff12 100644 --- a/lustre/lfsck/lfsck_layout.c +++ b/lustre/lfsck/lfsck_layout.c @@ -5535,6 +5535,10 @@ static void lfsck_layout_assistant_fill_pos(const struct lu_env *env, struct lfsck_assistant_data *lad = com->lc_data; struct lfsck_layout_req *llr; + if (((struct lfsck_layout *)(com->lc_file_ram))->ll_status != + LS_SCANNING_PHASE1) + return; + if (list_empty(&lad->lad_req_list)) return; diff --git a/lustre/lfsck/lfsck_namespace.c b/lustre/lfsck/lfsck_namespace.c index cbac028..931ffa2 100644 --- a/lustre/lfsck/lfsck_namespace.c +++ b/lustre/lfsck/lfsck_namespace.c @@ -6266,6 +6266,10 @@ static void lfsck_namespace_assistant_fill_pos(const struct lu_env *env, struct lfsck_assistant_data *lad = com->lc_data; struct lfsck_namespace_req *lnr; + if (((struct lfsck_namespace *)(com->lc_file_ram))->ln_status != + LS_SCANNING_PHASE1) + return; + if (list_empty(&lad->lad_req_list)) return; -- 1.8.3.1