Whamcloud - gitweb
LU-4517 tests: get params directly in _wait_osc_import_state
[fs/lustre-release.git] / lustre / mdt / mdt_coordinator.c
index 9d5d4cd..037bcbd 100644 (file)
@@ -133,7 +133,7 @@ struct hsm_scan_data {
        char                             fs_name[MTI_NAME_MAXLEN+1];
        /* request to be send to agents */
        int                              request_sz;    /** allocated size */
-       int                              max_request  /** vector size */
+       int                              max_requests;  /** vector size */
        int                              request_cnt;   /** used count */
        struct {
                int                      hal_sz;
@@ -182,14 +182,14 @@ static int mdt_coordinator_cb(const struct lu_env *env,
 
                /* Are agents full? */
                if (atomic_read(&cdt->cdt_request_count) ==
-                   cdt->cdt_max_request)
+                   cdt->cdt_max_requests)
                        break;
 
                /* first search if the request if known in the list we have
                 * build and if there is room in the request vector */
                empty_slot = -1;
                found = -1;
-               for (i = 0; i < hsd->max_request &&
+               for (i = 0; i < hsd->max_requests &&
                            (empty_slot == -1 || found == -1); i++) {
                        if (hsd->request[i].hal == NULL) {
                                empty_slot = i;
@@ -308,7 +308,8 @@ static int mdt_coordinator_cb(const struct lu_env *env,
 
                /* test if request too long, if yes cancel it
                 * the same way the copy tool acknowledge a cancel request */
-               if ((last + cdt->cdt_timeout) < cfs_time_current_sec()) {
+               if ((last + cdt->cdt_active_req_timeout)
+                    < cfs_time_current_sec()) {
                        struct hsm_progress_kernel pgs;
 
                        dump_llog_agent_req_rec("mdt_coordinator_cb(): "
@@ -371,7 +372,7 @@ static int mdt_coordinator_cb(const struct lu_env *env,
        case ARS_FAILED:
        case ARS_CANCELED:
        case ARS_SUCCEED:
-               if ((larr->arr_req_change + cdt->cdt_delay) <
+               if ((larr->arr_req_change + cdt->cdt_grace_delay) <
                    cfs_time_current_sec())
                        RETURN(LLOG_DEL_RECORD);
                break;
@@ -454,12 +455,12 @@ static int mdt_coordinator(void *data)
        hsd.max_cookie = 0;
        hsd.cookie_cnt = 0;
        hsd.cookies = NULL;
-       /* we use a copy of cdt_max_request in the cb, so if cdt_max_request
+       /* we use a copy of cdt_max_requests in the cb, so if cdt_max_requests
         * increases due to a change from /proc we do not overflow the
         * hsd.request[] vector
         */
-       hsd.max_request = cdt->cdt_max_request;
-       hsd.request_sz = hsd.max_request * sizeof(*hsd.request);
+       hsd.max_requests = cdt->cdt_max_requests;
+       hsd.request_sz = hsd.max_requests * sizeof(*hsd.request);
        OBD_ALLOC(hsd.request, hsd.request_sz);
        if (!hsd.request)
                GOTO(out, rc = -ENOMEM);
@@ -499,14 +500,14 @@ static int mdt_coordinator(void *data)
 
                CDEBUG(D_HSM, "coordinator starts reading llog\n");
 
-               if (hsd.max_request != cdt->cdt_max_request) {
-                       /* cdt_max_request has changed,
+               if (hsd.max_requests != cdt->cdt_max_requests) {
+                       /* cdt_max_requests has changed,
                         * we need to allocate a new buffer
                         */
                        OBD_FREE(hsd.request, hsd.request_sz);
-                       hsd.max_request = cdt->cdt_max_request;
+                       hsd.max_requests = cdt->cdt_max_requests;
                        hsd.request_sz =
-                                  hsd.max_request * sizeof(*hsd.request);
+                                  hsd.max_requests * sizeof(*hsd.request);
                        OBD_ALLOC(hsd.request, hsd.request_sz);
                        if (!hsd.request) {
                                rc = -ENOMEM;
@@ -556,7 +557,7 @@ static int mdt_coordinator(void *data)
                }
 
                /* here hsd contains a list of requests to be started */
-               for (i = 0; i < hsd.max_request; i++) {
+               for (i = 0; i < hsd.max_requests; i++) {
                        struct hsm_action_list  *hal;
                        struct hsm_action_item  *hai;
                        __u64                   *cookies;
@@ -565,7 +566,7 @@ static int mdt_coordinator(void *data)
 
                        /* still room for work ? */
                        if (atomic_read(&cdt->cdt_request_count) ==
-                           cdt->cdt_max_request)
+                           cdt->cdt_max_requests)
                                break;
 
                        if (hsd.request[i].hal == NULL)
@@ -638,7 +639,7 @@ clean_cb_alloc:
                }
 
                /* free hal allocated by callback */
-               for (i = 0; i < hsd.max_request; i++) {
+               for (i = 0; i < hsd.max_requests; i++) {
                        if (hsd.request[i].hal) {
                                OBD_FREE(hsd.request[i].hal,
                                         hsd.request[i].hal_sz);
@@ -878,7 +879,7 @@ int mdt_hsm_cdt_init(struct mdt_device *mdt)
                RETURN(rc);
 
        /* for mdt_ucred(), lu_ucred stored in lu_ucred_key */
-       rc = lu_context_init(&cdt->cdt_session, LCT_SESSION);
+       rc = lu_context_init(&cdt->cdt_session, LCT_SERVER_SESSION);
        if (rc == 0) {
                lu_context_enter(&cdt->cdt_session);
                cdt->cdt_env.le_ses = &cdt->cdt_session;
@@ -898,11 +899,11 @@ int mdt_hsm_cdt_init(struct mdt_device *mdt)
        /* default values for /proc tunnables
         * can be override by MGS conf */
        cdt->cdt_default_archive_id = 1;
-       cdt->cdt_delay = 60;
+       cdt->cdt_grace_delay = 60;
        cdt->cdt_loop_period = 10;
-       cdt->cdt_max_request = 3;
+       cdt->cdt_max_requests = 3;
        cdt->cdt_policy = CDT_DEFAULT_POLICY;
-       cdt->cdt_timeout = 3600;
+       cdt->cdt_active_req_timeout = 3600;
 
        RETURN(0);
 }
@@ -959,7 +960,6 @@ int mdt_hsm_cdt_start(struct mdt_device *mdt)
        /* just need to be larger than previous one */
        /* cdt_last_cookie is protected by cdt_llog_lock */
        cdt->cdt_last_cookie = cfs_time_current_sec();
-
        atomic_set(&cdt->cdt_request_count, 0);
        cdt->cdt_user_request_mask = (1UL << HSMA_RESTORE);
        cdt->cdt_group_request_mask = (1UL << HSMA_RESTORE);
@@ -1157,9 +1157,11 @@ out:
  * \param mti [IN] context
  * \param fid1 [IN]
  * \param fid2 [IN]
+ * \param mh_common [IN] MD HSM
  */
 static int hsm_swap_layouts(struct mdt_thread_info *mti,
-                           const lustre_fid *fid, const lustre_fid *dfid)
+                           const lustre_fid *fid, const lustre_fid *dfid,
+                           struct md_hsm *mh_common)
 {
        struct mdt_device       *mdt = mti->mti_mdt;
        struct mdt_object       *child1, *child2;
@@ -1182,15 +1184,28 @@ static int hsm_swap_layouts(struct mdt_thread_info *mti,
        /* if copy tool closes the volatile before sending the final
         * progress through llapi_hsm_copy_end(), all the objects
         * are removed and mdd_swap_layout LBUG */
-       if (mdt_object_exists(child2)) {
-               rc = mo_swap_layouts(mti->mti_env, mdt_object_child(child1),
-                                    mdt_object_child(child2), 0);
-       } else {
+       if (!mdt_object_exists(child2)) {
                CERROR("%s: Copytool has closed volatile file "DFID"\n",
                       mdt_obd_name(mti->mti_mdt), PFID(dfid));
-               rc = -ENOENT;
+               GOTO(out_child2, rc = -ENOENT);
        }
+       /* Since we only handle restores here, unconditionally use
+        * SWAP_LAYOUTS_MDS_HSM flag to ensure original layout will
+        * be preserved in case of failure during swap_layout and not
+        * leave a file in an intermediate but incoherent state.
+        * But need to setup HSM xattr of data FID before, reuse
+        * mti and mh presets for FID in hsm_cdt_request_completed(),
+        * only need to clear RELEASED and DIRTY.
+        */
+       mh_common->mh_flags &= ~(HS_RELEASED | HS_DIRTY);
+       rc = mdt_hsm_attr_set(mti, child2, mh_common);
+       if (rc == 0)
+               rc = mo_swap_layouts(mti->mti_env,
+                                    mdt_object_child(child1),
+                                    mdt_object_child(child2),
+                                    SWAP_LAYOUTS_MDS_HSM);
 
+out_child2:
        mdt_object_unlock_put(mti, child2, lh2, 1);
 out_child1:
        mdt_object_put(mti->mti_env, child1);
@@ -1320,8 +1335,10 @@ static int hsm_cdt_request_completed(struct mdt_thread_info *mti,
                case HSMA_RESTORE:
                        hsm_set_cl_event(&cl_flags, HE_RESTORE);
 
-                       /* clear RELEASED and DIRTY */
-                       mh.mh_flags &= ~(HS_RELEASED | HS_DIRTY);
+                       /* do not clear RELEASED and DIRTY here
+                        * this will occur in hsm_swap_layouts()
+                        */
+
                        /* Restoring has changed the file version on
                         * disk. */
                        mh.mh_arch_ver = pgs->hpk_data_version;
@@ -1378,7 +1395,7 @@ unlock:
                 * only if restore is successfull */
                if (pgs->hpk_errval == 0) {
                        rc = hsm_swap_layouts(mti, &car->car_hai->hai_fid,
-                                             &car->car_hai->hai_dfid);
+                                             &car->car_hai->hai_dfid, &mh);
                        if (rc) {
                                if (cdt->cdt_policy & CDT_NORETRY_ACTION)
                                        *status = ARS_FAILED;
@@ -1846,7 +1863,8 @@ static int lprocfs_wr_hsm_policy(struct file *file, const char *buffer,
                RETURN(-ENOMEM);
 
        if (copy_from_user(buf, buffer, count))
-               RETURN(-EFAULT);
+               GOTO(out, rc = -EFAULT);
+
        buf[count] = '\0';
 
        start = buf;
@@ -1871,7 +1889,7 @@ static int lprocfs_wr_hsm_policy(struct file *file, const char *buffer,
                        sz = PAGE_SIZE;
                        OBD_ALLOC(msg, sz);
                        if (!msg)
-                               RETURN(-ENOMEM);
+                               GOTO(out, rc = -ENOMEM);
 
                        hsm_policy_bit2str(0, false, msg, sz);
                        CWARN("%s: '%s' is unknown, "
@@ -1951,9 +1969,9 @@ static int lprocfs_wr_hsm_##VAR(struct file *file, const char *buffer,    \
 }
 
 GENERATE_PROC_METHOD(cdt_loop_period)
-GENERATE_PROC_METHOD(cdt_delay)
-GENERATE_PROC_METHOD(cdt_timeout)
-GENERATE_PROC_METHOD(cdt_max_request)
+GENERATE_PROC_METHOD(cdt_grace_delay)
+GENERATE_PROC_METHOD(cdt_active_req_timeout)
+GENERATE_PROC_METHOD(cdt_max_requests)
 GENERATE_PROC_METHOD(cdt_default_archive_id)
 
 /*
@@ -1984,10 +2002,24 @@ int lprocfs_wr_hsm_cdt_control(struct file *file, const char *buffer,
                        rc = mdt_hsm_cdt_start(mdt);
                }
        } else if (strncmp(buffer, CDT_STOP_CMD, strlen(CDT_STOP_CMD)) == 0) {
-               cdt->cdt_state = CDT_STOPPING;
+               if ((cdt->cdt_state == CDT_STOPPING) ||
+                   (cdt->cdt_state == CDT_STOPPED)) {
+                       CERROR("%s: Coordinator already stopped\n",
+                              mdt_obd_name(mdt));
+                       rc = -EALREADY;
+               } else {
+                       cdt->cdt_state = CDT_STOPPING;
+               }
        } else if (strncmp(buffer, CDT_DISABLE_CMD,
                           strlen(CDT_DISABLE_CMD)) == 0) {
-               cdt->cdt_state = CDT_DISABLE;
+               if ((cdt->cdt_state == CDT_STOPPING) ||
+                   (cdt->cdt_state == CDT_STOPPED)) {
+                       CERROR("%s: Coordinator is stopped\n",
+                              mdt_obd_name(mdt));
+                       rc = -EINVAL;
+               } else {
+                       cdt->cdt_state = CDT_DISABLE;
+               }
        } else if (strncmp(buffer, CDT_PURGE_CMD, strlen(CDT_PURGE_CMD)) == 0) {
                rc = hsm_cancel_all_actions(mdt);
        } else if (strncmp(buffer, CDT_HELP_CMD, strlen(CDT_HELP_CMD)) == 0) {
@@ -2185,32 +2217,35 @@ lprocfs_wr_hsm_other_request_mask(struct file *file, const char __user *buf,
 }
 
 static struct lprocfs_vars lprocfs_mdt_hsm_vars[] = {
-       { "agents",             NULL, NULL, NULL, &mdt_hsm_agent_fops, 0 },
-       { "agent_actions",      NULL, NULL, NULL,
-                               &mdt_agent_actions_fops, 0444 },
-       { "default_archive_id", lprocfs_rd_hsm_cdt_default_archive_id,
-                               lprocfs_wr_hsm_cdt_default_archive_id,
-                               NULL, NULL, 0 },
-       { "grace_delay",        lprocfs_rd_hsm_cdt_delay,
-                               lprocfs_wr_hsm_cdt_delay,
-                               NULL, NULL, 0 },
-       { "loop_period",        lprocfs_rd_hsm_cdt_loop_period,
-                               lprocfs_wr_hsm_cdt_loop_period,
-                               NULL, NULL, 0 },
-       { "max_requests",       lprocfs_rd_hsm_cdt_max_request,
-                               lprocfs_wr_hsm_cdt_max_request,
-                               NULL, NULL, 0 },
-       { "policy",             lprocfs_rd_hsm_policy, lprocfs_wr_hsm_policy,
-                               NULL, NULL, 0 },
-       { "request_timeout",    lprocfs_rd_hsm_cdt_timeout,
-                               lprocfs_wr_hsm_cdt_timeout,
-                               NULL, NULL, 0 },
-       { "requests",           NULL, NULL, NULL, &mdt_hsm_request_fops, 0 },
-       { "user_request_mask", lprocfs_rd_hsm_user_request_mask,
-         lprocfs_wr_hsm_user_request_mask, },
-       { "group_request_mask", lprocfs_rd_hsm_group_request_mask,
-         lprocfs_wr_hsm_group_request_mask, },
-       { "other_request_mask", lprocfs_rd_hsm_other_request_mask,
-         lprocfs_wr_hsm_other_request_mask, },
-       { NULL }
+       { "agents",                     NULL, NULL, NULL, &mdt_hsm_agent_fops,
+                                       0 },
+       { "actions",                    NULL, NULL, NULL, &mdt_hsm_actions_fops,
+                                       0444 },
+       { "default_archive_id",         lprocfs_rd_hsm_cdt_default_archive_id,
+                                       lprocfs_wr_hsm_cdt_default_archive_id,
+                                       NULL, NULL, 0 },
+       { "grace_delay",                lprocfs_rd_hsm_cdt_grace_delay,
+                                       lprocfs_wr_hsm_cdt_grace_delay,
+                                       NULL, NULL, 0 },
+       { "loop_period",                lprocfs_rd_hsm_cdt_loop_period,
+                                       lprocfs_wr_hsm_cdt_loop_period,
+                                       NULL, NULL, 0 },
+       { "max_requests",               lprocfs_rd_hsm_cdt_max_requests,
+                                       lprocfs_wr_hsm_cdt_max_requests,
+                                       NULL, NULL, 0 },
+       { "policy",                     lprocfs_rd_hsm_policy,
+                                       lprocfs_wr_hsm_policy,
+                                       NULL, NULL, 0 },
+       { "active_request_timeout",     lprocfs_rd_hsm_cdt_active_req_timeout,
+                                       lprocfs_wr_hsm_cdt_active_req_timeout,
+                                       NULL, NULL, 0 },
+       { "active_requests",            NULL, NULL, NULL,
+                                       &mdt_hsm_active_requests_fops, 0 },
+       { "user_request_mask",          lprocfs_rd_hsm_user_request_mask,
+                                       lprocfs_wr_hsm_user_request_mask, },
+       { "group_request_mask",         lprocfs_rd_hsm_group_request_mask,
+                                       lprocfs_wr_hsm_group_request_mask, },
+       { "other_request_mask",         lprocfs_rd_hsm_other_request_mask,
+                                       lprocfs_wr_hsm_other_request_mask, },
+       { 0 }
 };