Whamcloud - gitweb
LU-10699 hsm: simplify mdt_hsm_{add,get}_actions() 85/31385/2
authorJohn L. Hammond <john.hammond@intel.com>
Thu, 22 Feb 2018 18:27:14 +0000 (12:27 -0600)
committerOleg Drokin <oleg.drokin@intel.com>
Wed, 2 May 2018 02:23:28 +0000 (02:23 +0000)
Split the mdt_hsm_get_actions() functionality of
hsm_find_compatible_cb() into a new llog callback
(hsm_find_action_cb()). Simplify hsm_find_compatible() since it only
needs to handle adding new requests. Simplify the MDS_HSM_ACTIONS
handling code.

Test-Parameters: trivial testlist=sanity-hsm
Signed-off-by: John L. Hammond <john.hammond@intel.com>
Change-Id: Ie1e7eac85397d82ad9cc4790582bf8ba51713e70
Reviewed-on: https://review.whamcloud.com/31385
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/include/uapi/linux/lustre/lustre_user.h
lustre/mdt/mdt_hsm.c
lustre/mdt/mdt_hsm_cdt_client.c
lustre/mdt/mdt_internal.h

index 6ac8261..d5c3564 100644 (file)
@@ -1646,14 +1646,14 @@ enum hsm_states {
 #define HSM_FLAGS_MASK  (HSM_USER_MASK | HSM_STATUS_MASK)
 
 /**
- * HSM request progress state
+ * HSM request progress state
  */
 enum hsm_progress_states {
+       HPS_NONE        = 0,
        HPS_WAITING     = 1,
        HPS_RUNNING     = 2,
        HPS_DONE        = 3,
 };
-#define HPS_NONE       0
 
 static inline const char *hsm_progress_state2name(enum hsm_progress_states s)
 {
index e870268..e064cc1 100644 (file)
@@ -371,12 +371,12 @@ out:
  */
 int mdt_hsm_action(struct tgt_session_info *tsi)
 {
-       struct mdt_thread_info          *info;
-       struct hsm_current_action       *hca;
-       struct hsm_action_list          *hal = NULL;
-       struct hsm_action_item          *hai;
-       int                              hal_size;
-       int                              rc;
+       struct mdt_thread_info *info;
+       struct hsm_current_action *hca;
+       enum hsm_copytool_action action; /* HSMA_* */
+       enum agent_req_status status; /* ARS_* */
+       struct hsm_extent extent;
+       int rc;
        ENTRY;
 
        hca = req_capsule_server_get(tsi->tsi_pill,
@@ -390,42 +390,15 @@ int mdt_hsm_action(struct tgt_session_info *tsi)
        info = tsi2mdt_info(tsi);
        /* Only valid if client is remote */
        rc = mdt_init_ucred(info, (struct mdt_body *)info->mti_body);
-       if (rc)
+       if (rc < 0)
                GOTO(out, rc = err_serious(rc));
 
-       /* Coordinator information */
-       hal_size = sizeof(*hal) +
-                  cfs_size_round(MTI_NAME_MAXLEN) /* fsname */ +
-                  cfs_size_round(sizeof(*hai));
-
-       MDT_HSM_ALLOC(hal, hal_size);
-       if (hal == NULL)
-               GOTO(out_ucred, rc = -ENOMEM);
-
-       hal->hal_version = HAL_VERSION;
-       hal->hal_archive_id = 0;
-       hal->hal_flags = 0;
-       obd_uuid2fsname(hal->hal_fsname, mdt_obd_name(info->mti_mdt),
-                       MTI_NAME_MAXLEN);
-       hal->hal_count = 1;
-       hai = hai_first(hal);
-       hai->hai_action = HSMA_NONE;
-       hai->hai_cookie = 0;
-       hai->hai_gid = 0;
-       hai->hai_fid = info->mti_body->mbo_fid1;
-       hai->hai_len = sizeof(*hai);
-
-       rc = mdt_hsm_get_actions(info, hal);
-       if (rc)
-               GOTO(out_free, rc);
-
-       /* cookie is used to give back request status */
-       if (hai->hai_cookie == 0)
-               hca->hca_state = HPS_WAITING;
-       else
-               hca->hca_state = HPS_RUNNING;
+       rc = mdt_hsm_get_action(info, &info->mti_body->mbo_fid1, &action,
+                               &status, &extent);
+       if (rc < 0)
+               GOTO(out_ucred, rc);
 
-       switch (hai->hai_action) {
+       switch (action) {
        case HSMA_NONE:
                hca->hca_action = HUA_NONE;
                break;
@@ -444,16 +417,26 @@ int mdt_hsm_action(struct tgt_session_info *tsi)
        default:
                hca->hca_action = HUA_NONE;
                CERROR("%s: Unknown hsm action: %d on "DFID"\n",
-                      mdt_obd_name(info->mti_mdt),
-                      hai->hai_action, PFID(&hai->hai_fid));
+                      mdt_obd_name(info->mti_mdt), action,
+                      PFID(&info->mti_body->mbo_fid1));
                break;
        }
 
-       hca->hca_location = hai->hai_extent;
+       switch (status) {
+       case ARS_WAITING:
+               hca->hca_state = HPS_WAITING;
+               break;
+       case ARS_STARTED:
+               hca->hca_state = HPS_RUNNING;
+               break;
+       default:
+               hca->hca_state = HPS_NONE;
+               break;
+       }
+
+       hca->hca_location = extent;
 
        EXIT;
-out_free:
-       MDT_HSM_FREE(hal, hal_size);
 out_ucred:
        mdt_exit_ucred(info);
 out:
index 7f40dcf..b0c01c9 100644 (file)
@@ -86,13 +86,6 @@ static int hsm_find_compatible_cb(const struct lu_env *env,
                if (!lu_fid_eq(&hai->hai_fid, &larr->arr_hai.hai_fid))
                        continue;
 
-               /* HSMA_NONE is used to find running request for some FID */
-               if (hai->hai_action == HSMA_NONE) {
-                       hal->hal_archive_id = larr->arr_archive_id;
-                       hal->hal_flags = larr->arr_flags;
-                       *hai = larr->arr_hai;
-                       continue;
-               }
                /* in V1 we do not manage partial transfer
                 * so extent is always whole file
                 */
@@ -124,6 +117,10 @@ static int hsm_find_compatible(const struct lu_env *env, struct mdt_device *mdt,
        ok_cnt = 0;
        hai = hai_first(hal);
        for (i = 0; i < hal->hal_count; i++, hai = hai_next(hai)) {
+               /* We only support ARCHIVE, RESTORE, REMOVE and CANCEL here. */
+               if (hai->hai_action == HSMA_NONE)
+                       RETURN(-EINVAL);
+
                /* in a cancel request hai_cookie may be set by caller to
                 * show the request to be canceled
                 * if not we need to search by FID
@@ -471,63 +468,83 @@ bool mdt_hsm_restore_is_running(struct mdt_thread_info *mti,
        RETURN(is_running);
 }
 
+struct hsm_get_action_data {
+       const struct lu_fid *hgad_fid;
+       struct hsm_action_item hgad_hai;
+       enum agent_req_status hgad_status;
+};
+
+static int hsm_get_action_cb(const struct lu_env *env,
+                            struct llog_handle *llh,
+                            struct llog_rec_hdr *hdr, void *data)
+{
+       struct llog_agent_req_rec *larr = (struct llog_agent_req_rec *)hdr;
+       struct hsm_get_action_data *hgad = data;
+
+       /* A compatible request must be WAITING or STARTED and not a
+        * cancel. */
+       if ((larr->arr_status != ARS_WAITING &&
+            larr->arr_status != ARS_STARTED) ||
+           larr->arr_hai.hai_action == HSMA_CANCEL ||
+           !lu_fid_eq(&larr->arr_hai.hai_fid, hgad->hgad_fid))
+               RETURN(0);
+
+       hgad->hgad_hai = larr->arr_hai;
+       hgad->hgad_status = larr->arr_status;
+
+       RETURN(LLOG_PROC_BREAK);
+}
+
 /**
- * get registered action on a FID list
+ * get registered action on a FID
  * \param mti [IN]
- * \param hal [IN/OUT] requests
+ * \param fid [IN]
+ * \param action [OUT]
+ * \param status [OUT]
+ * \param extent [OUT]
  * \retval 0 success
  * \retval -ve failure
  */
-int mdt_hsm_get_actions(struct mdt_thread_info *mti,
-                       struct hsm_action_list *hal)
+int mdt_hsm_get_action(struct mdt_thread_info *mti,
+                      const struct lu_fid *fid,
+                      enum hsm_copytool_action *action,
+                      enum agent_req_status *status,
+                      struct hsm_extent *extent)
 {
-       struct mdt_device       *mdt = mti->mti_mdt;
-       struct coordinator      *cdt = &mdt->mdt_coordinator;
-       struct hsm_action_item  *hai;
-       int                      i, rc;
+       const struct lu_env *env = mti->mti_env;
+       struct mdt_device *mdt = mti->mti_mdt;
+       struct coordinator *cdt = &mdt->mdt_coordinator;
+       struct hsm_get_action_data hgad = {
+               .hgad_fid = fid,
+               .hgad_hai.hai_action = HSMA_NONE,
+       };
+       struct cdt_agent_req *car;
+       int rc;
        ENTRY;
 
-       hai = hai_first(hal);
-       for (i = 0; i < hal->hal_count; i++, hai = hai_next(hai)) {
-               hai->hai_action = HSMA_NONE;
-               if (!fid_is_sane(&hai->hai_fid))
-                       RETURN(-EINVAL);
-       }
-
        /* 1st we search in recorded requests */
-       rc = hsm_find_compatible(mti->mti_env, mdt, hal);
-       /* if llog file is not created, no action is recorded */
-       if (rc == -ENOENT)
-               RETURN(0);
-
-       if (rc)
+       rc = cdt_llog_process(env, mdt, hsm_get_action_cb, &hgad, 0, 0, READ);
+       if (rc < 0)
                RETURN(rc);
 
-       /* 2nd we search if the request are running
-        * cookie is cleared to tell to caller, the request is
-        * waiting
-        * we could in place use the record status, but in the future
-        * we may want do give back dynamic informations on the
-        * running request
-        */
-       hai = hai_first(hal);
-       for (i = 0; i < hal->hal_count; i++, hai = hai_next(hai)) {
-               struct cdt_agent_req *car;
+       *action = hgad.hgad_hai.hai_action;
+       *extent = hgad.hgad_hai.hai_extent;
+       *status = hgad.hgad_status;
 
-               car = mdt_cdt_find_request(cdt, hai->hai_cookie);
-               if (car == NULL) {
-                       hai->hai_cookie = 0;
-               } else {
-                       __u64 data_moved;
-
-                       mdt_cdt_get_work_done(car, &data_moved);
-                       /* this is just to give the volume of data moved
-                        * it means data_moved data have been moved from the
-                        * original request but we do not know which one
-                        */
-                       hai->hai_extent.length = data_moved;
-                       mdt_cdt_put_request(car);
-               }
+       if (*action == HSMA_NONE || *status != ARS_STARTED)
+               RETURN(0);
+
+       car = mdt_cdt_find_request(cdt, hgad.hgad_hai.hai_cookie);
+       if (car != NULL) {
+               __u64 data_moved;
+
+               mdt_cdt_get_work_done(car, &data_moved);
+               /* this is just to give the volume of data moved
+                * it means data_moved data have been moved from the
+                * original request but we do not know which one
+                */
+               extent->length = data_moved;
+               mdt_cdt_put_request(car);
        }
 
        RETURN(0);
index 26bb09e..05f0348 100644 (file)
@@ -939,8 +939,11 @@ int mdt_hsm_agent_send(struct mdt_thread_info *mti, struct hsm_action_list *hal,
 /* mdt/mdt_hsm_cdt_client.c */
 int mdt_hsm_add_actions(struct mdt_thread_info *info,
                        struct hsm_action_list *hal);
-int mdt_hsm_get_actions(struct mdt_thread_info *mti,
-                       struct hsm_action_list *hal);
+int mdt_hsm_get_action(struct mdt_thread_info *mti,
+                      const struct lu_fid *fid,
+                      enum hsm_copytool_action *action,
+                      enum agent_req_status *status,
+                      struct hsm_extent *extent);
 bool mdt_hsm_restore_is_running(struct mdt_thread_info *mti,
                                const struct lu_fid *fid);
 /* mdt/mdt_hsm_cdt_requests.c */