Whamcloud - gitweb
LU-7340 mdd: changelogs garbage collection
[fs/lustre-release.git] / lustre / mdd / mdd_internal.h
index 2588436..707c962 100644 (file)
 #include <lustre_log.h>
 #include <lustre_linkea.h>
 
+/* ChangeLog params for automatic purge mechanism */
+/* max time allowed for a user to stay idle in seconds */
+#define CHLOG_MAX_IDLE_TIME 2592000 /* = 30 days */
+/* max gap allowed for a user to stay idle in number of ChangeLog records
+ * this is an evaluation, assuming that chunk-size is LLOG_MIN_CHUNK_SIZE, of
+ * the indexes gap for half full changelogs */
+#define CHLOG_MAX_IDLE_INDEXES (((LLOG_MIN_CHUNK_SIZE - \
+                                 offsetof(struct llog_log_hdr, \
+                                          llh_bitmap[0]) - \
+                                 sizeof(struct llog_rec_tail)) * 4) * \
+                               ((LLOG_MIN_CHUNK_SIZE - \
+                                 offsetof(struct llog_log_hdr, \
+                                          llh_bitmap[0]) - \
+                                 sizeof(struct llog_rec_tail)) * 8))
+/* min time in seconds between two gc thread runs if none already started */
+#define CHLOG_MIN_GC_INTERVAL 3600
+/* minimum number of free ChangeLog catalog entries (ie, between cur and
+ * last indexes) before starting garbage collect */
+#define CHLOG_MIN_FREE_CAT_ENTRIES 2
+
 /* Changelog flags */
 /** changelog is recording */
 #define CLM_ON    0x00001
 /** some changelog records purged */
 #define CLM_PURGE 0x40000
 
+#define LLOG_CHANGELOG_HDR_SZ (sizeof(struct llog_changelog_rec) - \
+                              sizeof(struct changelog_rec))
+
 struct mdd_changelog {
        spinlock_t              mc_lock;        /* for index */
        int                     mc_flags;
        int                     mc_mask;
        __u64                   mc_index;
-       __u64                   mc_starttime;
+       ktime_t                 mc_starttime;
        spinlock_t              mc_user_lock;
        int                     mc_lastuser;
+       struct task_struct      *mc_gc_task;
+       time64_t                mc_gc_time;
 };
 
 static inline __u64 cl_time(void)
@@ -104,6 +129,11 @@ struct mdd_device {
         struct dt_object                *mdd_orphans; /* PENDING directory */
        struct proc_dir_entry            *mdd_proc_entry;
         struct mdd_changelog             mdd_cl;
+       unsigned int                     mdd_changelog_gc;
+       unsigned int                     mdd_changelog_max_idle_time;
+       unsigned long                    mdd_changelog_max_idle_indexes;
+       unsigned int                     mdd_changelog_min_gc_interval;
+       unsigned int                     mdd_changelog_min_free_cat_entries;
         unsigned long                    mdd_atime_diff;
         struct mdd_object               *mdd_dot_lustre;
         struct mdd_dot_lustre_objs       mdd_dot_lustre_objs;
@@ -121,12 +151,12 @@ enum mod_flags {
 };
 
 struct mdd_object {
-        struct md_object   mod_obj;
-        /* open count */
-        __u32             mod_count;
-        __u32             mod_valid;
-        __u64             mod_cltime;
-        unsigned long     mod_flags;
+       struct md_object        mod_obj;
+       /* open count */
+       u32                     mod_count;
+       u32                     mod_valid;
+       ktime_t                 mod_cltime;
+       unsigned long           mod_flags;
 };
 
 struct mdd_thread_info {
@@ -275,6 +305,9 @@ int mdd_declare_changelog_store(const struct lu_env *env,
                                       const struct lu_name *sname,
                                       struct thandle *handle);
 void mdd_changelog_rec_ext_jobid(struct changelog_rec *rec, const char *jobid);
+void mdd_changelog_rec_ext_extra_flags(struct changelog_rec *rec, __u64 eflags);
+void mdd_changelog_rec_extra_uidgid(struct changelog_rec *rec,
+                                   __u64 uid, __u64 gid);
 int mdd_changelog_store(const struct lu_env *env, struct mdd_device *mdd,
                        struct llog_changelog_rec *rec, struct thandle *th);
 int mdd_changelog_data_store(const struct lu_env *env, struct mdd_device *mdd,
@@ -348,6 +381,8 @@ int mdd_permission(const struct lu_env *env,
 int mdd_generic_thread_start(struct mdd_generic_thread *thread,
                             int (*func)(void *), void *data, char *name);
 void mdd_generic_thread_stop(struct mdd_generic_thread *thread);
+int mdd_changelog_user_purge(const struct lu_env *env, struct mdd_device *mdd,
+                            __u32 id);
 
 /* mdd_prepare.c */
 int mdd_compat_fixes(const struct lu_env *env, struct mdd_device *mdd);
@@ -574,20 +609,17 @@ mdo_invalidate(const struct lu_env *env, struct mdd_object *obj)
 
 static inline int
 mdo_declare_layout_change(const struct lu_env *env, struct mdd_object *obj,
-                         struct layout_intent *layout,
-                         const struct lu_buf *buf, struct thandle *handle)
+                         struct md_layout_change *mlc, struct thandle *handle)
 {
        return dt_declare_layout_change(env, mdd_object_child(obj),
-                                       layout, buf, handle);
+                                       mlc, handle);
 }
 
 static inline int
 mdo_layout_change(const struct lu_env *env, struct mdd_object *obj,
-                 struct layout_intent *layout, const struct lu_buf *buf,
-                 struct thandle *handle)
+                 struct md_layout_change *mlc, struct thandle *handle)
 {
-       return dt_layout_change(env, mdd_object_child(obj),
-                               layout, buf, handle);
+       return dt_layout_change(env, mdd_object_child(obj), mlc, handle);
 }
 
 static inline