From: John L. Hammond Date: Fri, 15 Dec 2017 19:24:32 +0000 (-0600) Subject: LU-10383 hsm: consolidate CDT restore handle handling X-Git-Tag: 2.10.57~7 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=5d58d8a88bbeff676c8c115382dd2570e79eba41;p=fs%2Flustre-release.git LU-10383 hsm: consolidate CDT restore handle handling 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 Change-Id: I9798ed93ea26a9d61d4786540c6dae95cdc38c4b Reviewed-on: https://review.whamcloud.com/30557 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Faccini Bruno Reviewed-by: Dmitry Eremin Reviewed-by: Oleg Drokin --- diff --git a/lustre/mdt/mdt_coordinator.c b/lustre/mdt/mdt_coordinator.c index 074fdeb..9dba7c1 100644 --- a/lustre/mdt/mdt_coordinator.c +++ b/lustre/mdt/mdt_coordinator.c @@ -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); diff --git a/lustre/mdt/mdt_hsm_cdt_agent.c b/lustre/mdt/mdt_hsm_cdt_agent.c index bbfc7a6..92c0eb6 100644 --- a/lustre/mdt/mdt_hsm_cdt_agent.c +++ b/lustre/mdt/mdt_hsm_cdt_agent.c @@ -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); } } diff --git a/lustre/mdt/mdt_hsm_cdt_client.c b/lustre/mdt/mdt_hsm_cdt_client.c index 9d0335c..c8f4d1e 100644 --- a/lustre/mdt/mdt_hsm_cdt_client.c +++ b/lustre/mdt/mdt_hsm_cdt_client.c @@ -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); } /** diff --git a/lustre/mdt/mdt_internal.h b/lustre/mdt/mdt_internal.h index 6467a37..0249708 100644 --- a/lustre/mdt/mdt_internal.h +++ b/lustre/mdt/mdt_internal.h @@ -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);