Whamcloud - gitweb
LU-10383 hsm: consolidate CDT restore handle handling 57/30557/4
authorJohn L. Hammond <john.hammond@intel.com>
Fri, 15 Dec 2017 19:24:32 +0000 (13:24 -0600)
committerOleg Drokin <oleg.drokin@intel.com>
Sun, 14 Jan 2018 02:37:52 +0000 (02:37 +0000)
Consolidate duplicated HSM coordinator restore handle handling into
new functions cdt_restore_handle_{add,del_(). Rename
mdt_hsm_restore_hdl_find() and some struct members for consistency.

Test-Parameters: trivial testlist=sanity-hsm
Signed-off-by: John L. Hammond <john.hammond@intel.com>
Change-Id: I9798ed93ea26a9d61d4786540c6dae95cdc38c4b
Reviewed-on: https://review.whamcloud.com/30557
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Faccini Bruno <bruno.faccini@intel.com>
Reviewed-by: Dmitry Eremin <dmitry.eremin@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/mdt/mdt_coordinator.c
lustre/mdt/mdt_hsm_cdt_agent.c
lustre/mdt/mdt_hsm_cdt_client.c
lustre/mdt/mdt_internal.h

index 074fdeb..9dba7c1 100644 (file)
@@ -471,7 +471,8 @@ static void mdt_hsm_cdt_cleanup(struct mdt_device *mdt)
 
        cdt_mti = lu_context_key_get(&cdt->cdt_env.le_ctx, &mdt_thread_key);
        mutex_lock(&cdt->cdt_restore_lock);
-       list_for_each_entry_safe(crh, tmp3, &cdt->cdt_restore_hdl, crh_list) {
+       list_for_each_entry_safe(crh, tmp3, &cdt->cdt_restore_handle_list,
+                                crh_list) {
                list_del(&crh->crh_list);
                /* give back layout lock */
                mdt_object_unlock(cdt_mti, NULL, &crh->crh_lh, 1);
@@ -735,6 +736,56 @@ clean_cb_alloc:
        RETURN(rc);
 }
 
+int cdt_restore_handle_add(struct mdt_thread_info *mti, struct coordinator *cdt,
+                          const struct lu_fid *fid,
+                          const struct hsm_extent *he)
+{
+       struct cdt_restore_handle *crh;
+       struct mdt_object *obj;
+       int rc;
+       ENTRY;
+
+       OBD_SLAB_ALLOC_PTR(crh, mdt_hsm_cdt_kmem);
+       if (crh == NULL)
+               RETURN(-ENOMEM);
+
+       crh->crh_fid = *fid;
+       /* in V1 all file is restored
+        * crh->extent.start = he->offset;
+        * crh->extent.end = he->offset + he->length;
+        */
+       crh->crh_extent.start = 0;
+       crh->crh_extent.end = he->length;
+       /* get the layout lock */
+       mdt_lock_reg_init(&crh->crh_lh, LCK_EX);
+       obj = mdt_object_find_lock(mti, &crh->crh_fid, &crh->crh_lh,
+                                  MDS_INODELOCK_LAYOUT);
+       if (IS_ERR(obj))
+               GOTO(out_crh, rc = PTR_ERR(obj));
+
+       /* We do not keep a reference on the object during the restore
+        * which can be very long. */
+       mdt_object_put(mti->mti_env, obj);
+
+       mutex_lock(&cdt->cdt_restore_lock);
+       if (unlikely(cdt->cdt_state == CDT_STOPPED ||
+                    cdt->cdt_state == CDT_STOPPING)) {
+               mutex_unlock(&cdt->cdt_restore_lock);
+               GOTO(out_lh, rc = -EAGAIN);
+       }
+
+       list_add_tail(&crh->crh_list, &cdt->cdt_restore_handle_list);
+       mutex_unlock(&cdt->cdt_restore_lock);
+
+       RETURN(0);
+out_lh:
+       mdt_object_unlock(mti, NULL, &crh->crh_lh, 1);
+out_crh:
+       OBD_SLAB_FREE_PTR(crh, mdt_hsm_cdt_kmem);
+
+       return rc;
+}
+
 /**
  * lookup a restore handle by FID
  * caller needs to hold cdt_restore_lock
@@ -743,19 +794,41 @@ clean_cb_alloc:
  * \retval cdt_restore_handle found
  * \retval NULL not found
  */
-struct cdt_restore_handle *mdt_hsm_restore_hdl_find(struct coordinator *cdt,
-                                                      const struct lu_fid *fid)
+struct cdt_restore_handle *cdt_restore_handle_find(struct coordinator *cdt,
+                                                  const struct lu_fid *fid)
 {
-       struct cdt_restore_handle       *crh;
+       struct cdt_restore_handle *crh;
        ENTRY;
 
-       list_for_each_entry(crh, &cdt->cdt_restore_hdl, crh_list) {
+       list_for_each_entry(crh, &cdt->cdt_restore_handle_list, crh_list) {
                if (lu_fid_eq(&crh->crh_fid, fid))
                        RETURN(crh);
        }
+
        RETURN(NULL);
 }
 
+void cdt_restore_handle_del(struct mdt_thread_info *mti,
+                           struct coordinator *cdt, const struct lu_fid *fid)
+{
+       struct cdt_restore_handle *crh;
+
+       /* give back layout lock */
+       mutex_lock(&cdt->cdt_restore_lock);
+       crh = cdt_restore_handle_find(cdt, fid);
+       if (crh != NULL)
+               list_del(&crh->crh_list);
+       mutex_unlock(&cdt->cdt_restore_lock);
+
+       if (crh == NULL)
+               return;
+
+       /* XXX We pass a NULL object since the restore handle does not
+        * keep a reference on the object being restored. */
+       mdt_object_unlock(mti, NULL, &crh->crh_lh, 1);
+       OBD_SLAB_FREE_PTR(crh, mdt_hsm_cdt_kmem);
+}
+
 /**
  * data passed to llog_cat_process() callback
  * to scan requests and take actions
@@ -780,11 +853,9 @@ static int hsm_restore_cb(const struct lu_env *env,
 {
        struct llog_agent_req_rec       *larr;
        struct hsm_restore_data         *hrd;
-       struct cdt_restore_handle       *crh;
        struct hsm_action_item          *hai;
        struct mdt_thread_info          *mti;
        struct coordinator              *cdt;
-       struct mdt_object               *child;
        int rc;
        ENTRY;
 
@@ -815,33 +886,7 @@ static int hsm_restore_cb(const struct lu_env *env,
                        GOTO(out, rc);
        }
 
-       OBD_SLAB_ALLOC_PTR(crh, mdt_hsm_cdt_kmem);
-       if (crh == NULL)
-               RETURN(-ENOMEM);
-
-       crh->crh_fid = hai->hai_fid;
-       /* in V1 all file is restored
-       crh->extent.start = hai->hai_extent.offset;
-       crh->extent.end = hai->hai_extent.offset + hai->hai_extent.length;
-       */
-       crh->crh_extent.start = 0;
-       crh->crh_extent.end = hai->hai_extent.length;
-       /* get the layout lock */
-       mdt_lock_reg_init(&crh->crh_lh, LCK_EX);
-       child = mdt_object_find_lock(mti, &crh->crh_fid, &crh->crh_lh,
-                                    MDS_INODELOCK_LAYOUT);
-       if (IS_ERR(child))
-               GOTO(out, rc = PTR_ERR(child));
-
-       rc = 0;
-       /* we choose to not keep a reference
-        * on the object during the restore time which can be very long */
-       mdt_object_put(mti->mti_env, child);
-
-       mutex_lock(&cdt->cdt_restore_lock);
-       list_add_tail(&crh->crh_list, &cdt->cdt_restore_hdl);
-       mutex_unlock(&cdt->cdt_restore_lock);
-
+       rc = cdt_restore_handle_add(mti, cdt, &hai->hai_fid, &hai->hai_extent);
 out:
        RETURN(rc);
 }
@@ -911,7 +956,7 @@ int mdt_hsm_cdt_init(struct mdt_device *mdt)
 
        INIT_LIST_HEAD(&cdt->cdt_request_list);
        INIT_LIST_HEAD(&cdt->cdt_agents);
-       INIT_LIST_HEAD(&cdt->cdt_restore_hdl);
+       INIT_LIST_HEAD(&cdt->cdt_restore_handle_list);
 
        cdt->cdt_request_cookie_hash = cfs_hash_create("REQUEST_COOKIE_HASH",
                                                       CFS_HASH_BITS_MIN,
@@ -1453,8 +1498,6 @@ static int hsm_cdt_request_completed(struct mdt_thread_info *mti,
         * if no retry will be attempted and if object is still alive,
         * in other cases we just unlock the object */
        if (car->car_hai->hai_action == HSMA_RESTORE) {
-               struct cdt_restore_handle       *crh;
-
                /* restore in data FID done, we swap the layouts
                 * only if restore is successful */
                if (pgs->hpk_errval == 0 && !IS_ERR(obj)) {
@@ -1477,21 +1520,7 @@ static int hsm_cdt_request_completed(struct mdt_thread_info *mti,
                             &car->car_hai->hai_fid);
                need_changelog = false;
 
-               /* give back layout lock */
-               mutex_lock(&cdt->cdt_restore_lock);
-               crh = mdt_hsm_restore_hdl_find(cdt, &car->car_hai->hai_fid);
-               if (crh != NULL)
-                       list_del(&crh->crh_list);
-               mutex_unlock(&cdt->cdt_restore_lock);
-               /* Just give back layout lock, we keep the reference
-                * which is given back later with the lock for HSM
-                * flags.
-                * XXX obj may be invalid so we do not pass it. */
-               if (crh != NULL)
-                       mdt_object_unlock(mti, NULL, &crh->crh_lh, 1);
-
-               if (crh != NULL)
-                       OBD_SLAB_FREE_PTR(crh, mdt_hsm_cdt_kmem);
+               cdt_restore_handle_del(mti, cdt, &car->car_hai->hai_fid);
        }
 
        GOTO(out, rc);
index bbfc7a6..92c0eb6 100644 (file)
@@ -528,22 +528,8 @@ int mdt_hsm_agent_send(struct mdt_thread_info *mti,
 
                        /* if restore and record status updated, give
                         * back granted layout lock */
-                       if (hai->hai_action == HSMA_RESTORE) {
-                               struct cdt_restore_handle *crh = NULL;
-
-                               mutex_lock(&cdt->cdt_restore_lock);
-                               crh = mdt_hsm_restore_hdl_find(cdt,
-                                                              &hai->hai_fid);
-                               if (crh != NULL)
-                                       list_del(&crh->crh_list);
-                               mutex_unlock(&cdt->cdt_restore_lock);
-                               if (crh != NULL) {
-                                       mdt_object_unlock(mti, NULL,
-                                                         &crh->crh_lh, 1);
-                                       OBD_SLAB_FREE_PTR(crh,
-                                                         mdt_hsm_cdt_kmem);
-                               }
-                       }
+                       if (hai->hai_action == HSMA_RESTORE)
+                               cdt_restore_handle_del(mti, cdt, &hai->hai_fid);
                }
        }
 
index 9d0335c..c8f4d1e 100644 (file)
@@ -385,50 +385,14 @@ static int mdt_hsm_register_hal(struct mdt_thread_info *mti,
 
                /* if restore, take an exclusive lock on layout */
                if (hai->hai_action == HSMA_RESTORE) {
-                       struct cdt_restore_handle *crh;
-
                        /* in V1 only whole file is supported. */
                        if (hai->hai_extent.offset != 0)
                                GOTO(out, rc = -EPROTO);
 
-                       OBD_SLAB_ALLOC_PTR(crh, mdt_hsm_cdt_kmem);
-                       if (crh == NULL)
-                               GOTO(out, rc = -ENOMEM);
-
-                       crh->crh_fid = hai->hai_fid;
-                       /* in V1 only whole file is supported. However the
-                        * restore may be due to truncate. */
-                       crh->crh_extent.start = 0;
-                       crh->crh_extent.end = hai->hai_extent.length;
-
-                       mdt_lock_reg_init(&crh->crh_lh, LCK_EX);
-                       obj = mdt_object_find_lock(mti, &crh->crh_fid,
-                                                  &crh->crh_lh,
-                                                  MDS_INODELOCK_LAYOUT);
-                       if (IS_ERR(obj)) {
-                               rc = PTR_ERR(obj);
-                               CERROR("%s: cannot take layout lock for "
-                                      DFID": rc = %d\n", mdt_obd_name(mdt),
-                                      PFID(&crh->crh_fid), rc);
-                               OBD_SLAB_FREE_PTR(crh, mdt_hsm_cdt_kmem);
+                       rc = cdt_restore_handle_add(mti, cdt, &hai->hai_fid,
+                                                   &hai->hai_extent);
+                       if (rc < 0)
                                GOTO(out, rc);
-                       }
-
-                       /* we choose to not keep a keep a reference
-                        * on the object during the restore time which can be
-                        * very long */
-                       mdt_object_put(mti->mti_env, obj);
-
-                       mutex_lock(&cdt->cdt_restore_lock);
-                       if (unlikely((cdt->cdt_state == CDT_STOPPED) ||
-                                    (cdt->cdt_state == CDT_STOPPING))) {
-                               mutex_unlock(&cdt->cdt_restore_lock);
-                               mdt_object_unlock(mti, NULL, &crh->crh_lh, 1);
-                               OBD_SLAB_FREE_PTR(crh, mdt_hsm_cdt_kmem);
-                               GOTO(out, rc = -EAGAIN);
-                       }
-                       list_add_tail(&crh->crh_list, &cdt->cdt_restore_hdl);
-                       mutex_unlock(&cdt->cdt_restore_lock);
                }
 record:
                /*
@@ -515,24 +479,15 @@ out:
 bool mdt_hsm_restore_is_running(struct mdt_thread_info *mti,
                                const struct lu_fid *fid)
 {
-       struct mdt_device               *mdt = mti->mti_mdt;
-       struct coordinator              *cdt = &mdt->mdt_coordinator;
-       struct cdt_restore_handle       *crh;
-       bool                             rc = false;
+       struct coordinator *cdt = &mti->mti_mdt->mdt_coordinator;
+       bool is_running;
        ENTRY;
 
-       if (!fid_is_sane(fid))
-               RETURN(rc);
-
        mutex_lock(&cdt->cdt_restore_lock);
-       list_for_each_entry(crh, &cdt->cdt_restore_hdl, crh_list) {
-               if (lu_fid_eq(&crh->crh_fid, fid)) {
-                       rc = true;
-                       break;
-               }
-       }
+       is_running = (cdt_restore_handle_find(cdt, fid) != NULL);
        mutex_unlock(&cdt->cdt_restore_lock);
-       RETURN(rc);
+
+       RETURN(is_running);
 }
 
 /**
index 6467a37..0249708 100644 (file)
@@ -169,8 +169,7 @@ struct coordinator {
        struct list_head         cdt_request_list;
        struct list_head         cdt_agents;          /**< list of register
                                                       * agents */
-       struct list_head         cdt_restore_hdl;     /**< list of restore lock
-                                                      * handles */
+       struct list_head         cdt_restore_handle_list;
 
        /* Hash of cookies to locations of record locations in agent
         * request log. */
@@ -958,8 +957,13 @@ int mdt_cdt_remove_request(struct coordinator *cdt, __u64 cookie);
 /* mdt/mdt_coordinator.c */
 void mdt_hsm_dump_hal(int level, const char *prefix,
                      struct hsm_action_list *hal);
-struct cdt_restore_handle *mdt_hsm_restore_hdl_find(struct coordinator *cdt,
-                                               const struct lu_fid *fid);
+int cdt_restore_handle_add(struct mdt_thread_info *mti, struct coordinator *cdt,
+                          const struct lu_fid *fid,
+                          const struct hsm_extent *he);
+struct cdt_restore_handle *cdt_restore_handle_find(struct coordinator *cdt,
+                                                  const struct lu_fid *fid);
+void cdt_restore_handle_del(struct mdt_thread_info *mti,
+                           struct coordinator *cdt, const struct lu_fid *fid);
 /* coordinator management */
 int mdt_hsm_cdt_init(struct mdt_device *mdt);
 int mdt_hsm_cdt_stop(struct mdt_device *mdt);