Whamcloud - gitweb
LU-8569 lfsck: cleanup lfsck requests list before exit 23/22723/5
authorFan Yong <fan.yong@intel.com>
Sat, 16 Jul 2016 21:42:03 +0000 (05:42 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Thu, 20 Oct 2016 10:35:45 +0000 (10:35 +0000)
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 <fan.yong@intel.com>
Change-Id: I7facd20e2742c7ad5d4fbee1c975dacd8f6ea363
Reviewed-on: http://review.whamcloud.com/22723
Tested-by: Jenkins
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Lai Siyao <lai.siyao@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/lfsck/lfsck_engine.c
lustre/lfsck/lfsck_layout.c
lustre/lfsck/lfsck_namespace.c

index 97d0427..f5b5e70 100644 (file)
@@ -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;
index 06fb33c..d1cff12 100644 (file)
@@ -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;
 
index cbac028..931ffa2 100644 (file)
@@ -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;