Whamcloud - gitweb
LU-13055 mdd: per-user changelog names and mask
[fs/lustre-release.git] / lustre / mdd / mdd_trans.c
index c0e128c..0520052 100644 (file)
@@ -77,7 +77,7 @@ struct mdd_changelog_gc {
        __u32 mcgc_id;
        __u32 mcgc_maxtime;
        __u64 mcgc_maxindexes;
-       bool mcgc_found;
+       char mcgc_name[CHANGELOG_USER_NAMELEN_FULL];
 };
 
 /* return first registered ChangeLog user idle since too long
@@ -86,16 +86,16 @@ static int mdd_changelog_gc_cb(const struct lu_env *env,
                               struct llog_handle *llh,
                               struct llog_rec_hdr *hdr, void *data)
 {
-       struct llog_changelog_user_rec *rec;
-       struct mdd_changelog_gc *mcgc = (struct mdd_changelog_gc *)data;
+       struct llog_changelog_user_rec2 *rec;
+       struct mdd_changelog_gc *mcgc = data;
        struct mdd_device *mdd = mcgc->mcgc_mdd;
+
        ENTRY;
 
        if ((llh->lgh_hdr->llh_flags & LLOG_F_IS_PLAIN) == 0)
                RETURN(-ENXIO);
 
-       rec = container_of(hdr, struct llog_changelog_user_rec,
-                          cur_hdr);
+       rec = container_of(hdr, typeof(*rec), cur_hdr);
 
        /* find oldest idle user, based on last record update/cancel time (new
         * behavior), or for old user records, last record index vs current
@@ -103,9 +103,6 @@ static int mdd_changelog_gc_cb(const struct lu_env *env,
         * first as we assume they could be idle since longer
         */
        if (rec->cur_time != 0) {
-               /* FIXME !!!! cur_time is a timestamp but only 32 bit in
-                * in size. This is not 2038 safe !!!!
-                */
                u32 time_now = (u32)ktime_get_real_seconds();
                timeout_t time_out = rec->cur_time +
                                     mdd->mdd_changelog_max_idle_time;
@@ -119,7 +116,8 @@ static int mdd_changelog_gc_cb(const struct lu_env *env,
                    mcgc->mcgc_maxindexes == 0) {
                        mcgc->mcgc_maxtime = idle_time;
                        mcgc->mcgc_id = rec->cur_id;
-                       mcgc->mcgc_found = true;
+                       mdd_chlg_username(rec, mcgc->mcgc_name,
+                                         sizeof(mcgc->mcgc_name));
                }
        } else {
                /* old user record with no idle time stamp, so use empirical
@@ -134,7 +132,8 @@ static int mdd_changelog_gc_cb(const struct lu_env *env,
                    idle_indexes > mcgc->mcgc_maxindexes) {
                        mcgc->mcgc_maxindexes = idle_indexes;
                        mcgc->mcgc_id = rec->cur_id;
-                       mcgc->mcgc_found = true;
+                       mdd_chlg_username(rec, mcgc->mcgc_name,
+                                         sizeof(mcgc->mcgc_name));
                }
 
        }
@@ -144,16 +143,11 @@ static int mdd_changelog_gc_cb(const struct lu_env *env,
 /* recover space from long-term inactive ChangeLog users */
 static int mdd_chlg_garbage_collect(void *data)
 {
-       struct mdd_device *mdd = (struct mdd_device *)data;
-       struct lu_env             *env = NULL;
-       int                        rc;
+       struct mdd_device *mdd = data;
+       struct lu_env *env = NULL;
+       int rc;
        struct llog_ctxt *ctxt;
-       struct mdd_changelog_gc mcgc = {
-               .mcgc_mdd = mdd,
-               .mcgc_found = false,
-               .mcgc_maxtime = 0,
-               .mcgc_maxindexes = 0,
-       };
+
        ENTRY;
 
        mdd->mdd_cl.mc_gc_task = current;
@@ -170,6 +164,12 @@ static int mdd_chlg_garbage_collect(void *data)
                GOTO(out, rc);
 
        for (;;) {
+               struct mdd_changelog_gc mcgc = {
+                       .mcgc_mdd = mdd,
+                       .mcgc_maxtime = 0,
+                       .mcgc_maxindexes = 0,
+               };
+
                ctxt = llog_get_context(mdd2obd_dev(mdd),
                                        LLOG_CHANGELOG_USER_ORIG_CTXT);
                if (ctxt == NULL ||
@@ -178,30 +178,23 @@ static int mdd_chlg_garbage_collect(void *data)
 
                rc = llog_cat_process(env, ctxt->loc_handle,
                                      mdd_changelog_gc_cb, &mcgc, 0, 0);
-               if (rc != 0 || mcgc.mcgc_found == false)
+               if (rc != 0 || !mcgc.mcgc_name[0])
                        break;
                llog_ctxt_put(ctxt);
 
                if (mcgc.mcgc_maxindexes != 0)
-                       CWARN("%s: Force deregister of ChangeLog user cl%d "
-                             "idle with more than %llu unprocessed records\n",
-                             mdd2obd_dev(mdd)->obd_name, mcgc.mcgc_id,
+                       CWARN("%s: Force deregister of ChangeLog user %s idle with more than %llu unprocessed records\n",
+                             mdd2obd_dev(mdd)->obd_name, mcgc.mcgc_name,
                              mcgc.mcgc_maxindexes);
                else
-                       CWARN("%s: Force deregister of ChangeLog user cl%d "
-                             "idle since more than %us\n",
-                             mdd2obd_dev(mdd)->obd_name, mcgc.mcgc_id,
+                       CWARN("%s: Force deregister of ChangeLog user %s idle since more than %us\n",
+                             mdd2obd_dev(mdd)->obd_name, mcgc.mcgc_name,
                              mcgc.mcgc_maxtime);
 
                mdd_changelog_user_purge(env, mdd, mcgc.mcgc_id);
 
                if (kthread_should_stop())
                        GOTO(out_env, rc = 0);
-
-               /* try again to search for another candidate */
-               mcgc.mcgc_found = false;
-               mcgc.mcgc_maxtime = 0;
-               mcgc.mcgc_maxindexes = 0;
        }
 
 out_ctxt: