X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmdt%2Fmdt_hsm_cdt_client.c;h=5cc2c351aa7b2f60ab9df240decec64c6bd18a98;hb=dd9e79b64d49f6d66d121f072e0e7516963b4da0;hp=8e388b7e1846a9a9aa17673d4eb7753ec5cabc81;hpb=9ee81f920bb3f032e9b3e63bc93cd4d776396059;p=fs%2Flustre-release.git diff --git a/lustre/mdt/mdt_hsm_cdt_client.c b/lustre/mdt/mdt_hsm_cdt_client.c index 8e388b7..5cc2c35 100644 --- a/lustre/mdt/mdt_hsm_cdt_client.c +++ b/lustre/mdt/mdt_hsm_cdt_client.c @@ -44,21 +44,12 @@ #include "mdt_internal.h" /** - * data passed to llog_cat_process() callback - * to find compatible requests - */ -struct hsm_compat_data_cb { - struct coordinator *cdt; - struct hsm_action_list *hal; -}; - -/** * llog_cat_process() callback, used to find record * compatibles with a new hsm_action_list * \param env [IN] environment * \param llh [IN] llog handle * \param hdr [IN] llog record - * \param data [IN] cb data = hsm_compat_data_cb + * \param data [IN] cb data = hal * \retval 0 success * \retval -ve failure */ @@ -66,14 +57,12 @@ static int hsm_find_compatible_cb(const struct lu_env *env, struct llog_handle *llh, struct llog_rec_hdr *hdr, void *data) { - struct llog_agent_req_rec *larr; - struct hsm_compat_data_cb *hcdcb; - struct hsm_action_item *hai; - int i; + struct llog_agent_req_rec *larr = (struct llog_agent_req_rec *)hdr; + struct hsm_action_list *hal = data; + struct hsm_action_item *hai; + int i; ENTRY; - larr = (struct llog_agent_req_rec *)hdr; - hcdcb = data; /* a compatible request must be WAITING or STARTED * and not a cancel */ if ((larr->arr_status != ARS_WAITING && @@ -81,8 +70,8 @@ static int hsm_find_compatible_cb(const struct lu_env *env, larr->arr_hai.hai_action == HSMA_CANCEL) RETURN(0); - hai = hai_first(hcdcb->hal); - for (i = 0; i < hcdcb->hal->hal_count; i++, hai = hai_next(hai)) { + hai = hai_first(hal); + for (i = 0; i < hal->hal_count; i++, hai = hai_next(hai)) { /* if request is a CANCEL: * if cookie set in the request, there is no need to find a * compatible one, the cookie in the request is directly used. @@ -97,21 +86,13 @@ 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) { - hcdcb->hal->hal_archive_id = larr->arr_archive_id; - hcdcb->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 */ hai->hai_cookie = larr->arr_hai.hai_cookie; /* we read the archive number from the request we cancel */ - if (hai->hai_action == HSMA_CANCEL && - hcdcb->hal->hal_archive_id == 0) - hcdcb->hal->hal_archive_id = larr->arr_archive_id; + if (hai->hai_action == HSMA_CANCEL && hal->hal_archive_id == 0) + hal->hal_archive_id = larr->arr_archive_id; } RETURN(0); } @@ -129,33 +110,31 @@ static int hsm_find_compatible_cb(const struct lu_env *env, static int hsm_find_compatible(const struct lu_env *env, struct mdt_device *mdt, struct hsm_action_list *hal) { - struct hsm_action_item *hai; - struct hsm_compat_data_cb hcdcb; - int rc, i, ok_cnt; + struct hsm_action_item *hai; + int rc = 0, i; + bool check = false; ENTRY; - ok_cnt = 0; hai = hai_first(hal); for (i = 0; i < hal->hal_count; i++, hai = hai_next(hai)) { - /* 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 + /* 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 there is at least one cancel + * request that does not have a cookie set we need to search by + * FID; we can skip checking in all other cases */ - if (hai->hai_action == HSMA_CANCEL && hai->hai_cookie != 0) - ok_cnt++; - else - hai->hai_cookie = 0; + if (hai->hai_action == HSMA_CANCEL && hai->hai_cookie == 0) { + check = true; + break; + } } - /* if all requests are cancel with cookie, no need to find compatible */ - if (ok_cnt == hal->hal_count) - RETURN(0); - - hcdcb.cdt = &mdt->mdt_coordinator; - hcdcb.hal = hal; - - rc = cdt_llog_process(env, mdt, hsm_find_compatible_cb, &hcdcb, 0, 0, - READ); + if (check) + rc = cdt_llog_process(env, mdt, hsm_find_compatible_cb, hal, 0, + 0, READ); RETURN(rc); } @@ -439,7 +418,7 @@ int mdt_hsm_add_actions(struct mdt_thread_info *mti, ENTRY; /* no coordinator started, so we cannot serve requests */ - if (cdt->cdt_state == CDT_STOPPED) + if (cdt->cdt_state == CDT_STOPPED || cdt->cdt_state == CDT_INIT) RETURN(-EAGAIN); if (!hal_is_sane(hal)) @@ -487,63 +466,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) + rc = cdt_llog_process(env, mdt, hsm_get_action_cb, &hgad, 0, 0, READ); + if (rc < 0) + RETURN(rc); + + *action = hgad.hgad_hai.hai_action; + *extent = hgad.hgad_hai.hai_extent; + *status = hgad.hgad_status; + + if (*action == HSMA_NONE || *status != ARS_STARTED) RETURN(0); - if (rc) - RETURN(rc); + car = mdt_cdt_find_request(cdt, hgad.hgad_hai.hai_cookie); + if (car != NULL) { + __u64 data_moved; - /* 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; - - 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); - } + 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);