From c6844279bb0191490e2dbede5950c66491a0db2e Mon Sep 17 00:00:00 2001 From: yury Date: Sun, 24 Aug 2008 15:53:38 +0000 Subject: [PATCH] b=14608 r=wangdi,shadow - new recov thread code; - cleanups and fixes. --- lustre/include/lustre_log.h | 118 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 107 insertions(+), 11 deletions(-) diff --git a/lustre/include/lustre_log.h b/lustre/include/lustre_log.h index 91e1f93..c5afafb8 100644 --- a/lustre/include/lustre_log.h +++ b/lustre/include/lustre_log.h @@ -112,16 +112,44 @@ extern int llog_cancel_rec(struct llog_handle *loghandle, int index); extern int llog_close(struct llog_handle *cathandle); extern int llog_get_size(struct llog_handle *loghandle); -/* llog_cat.c - catalog api */ +/* llog_cat.c - catalog api */ struct llog_process_data { - void *lpd_data; - llog_cb_t lpd_cb; + /** + * Any useful data needed while processing catalog. This is + * passed later to process callback. + */ + void *lpd_data; + /** + * Catalog process callback function, called for each record + * in catalog. + */ + llog_cb_t lpd_cb; }; struct llog_process_cat_data { - int first_idx; - int last_idx; - /* to process catalog across zero record */ + /** + * Temporary stored first_idx while scanning log. + */ + int lpcd_first_idx; + /** + * Temporary stored last_idx while scanning log. + */ + int lpcd_last_idx; +}; + +struct llog_process_cat_args { + /** + * Llog context used in recovery thread on OST (recov_thread.c) + */ + struct llog_ctxt *lpca_ctxt; + /** + * Llog callback used in recovery thread on OST (recov_thread.c) + */ + void *lpca_cb; + /** + * Data pointer for llog callback. + */ + void *lpca_arg; }; int llog_cat_put(struct llog_handle *cathandle); @@ -130,6 +158,7 @@ int llog_cat_add_rec(struct llog_handle *cathandle, struct llog_rec_hdr *rec, int llog_cat_cancel_records(struct llog_handle *cathandle, int count, struct llog_cookie *cookies); int llog_cat_process(struct llog_handle *cat_llh, llog_cb_t cb, void *data); +int llog_cat_process_thread(void *data); int llog_cat_reverse_process(struct llog_handle *cat_llh, llog_cb_t cb, void *data); int llog_cat_set_first_idx(struct llog_handle *cathandle, int index); @@ -178,9 +207,9 @@ int llog_obd_repl_cancel(struct llog_ctxt *ctxt, struct lov_stripe_md *lsm, int count, struct llog_cookie *cookies, int flags); int llog_obd_repl_sync(struct llog_ctxt *ctxt, struct obd_export *exp); -int llog_repl_connect(struct llog_ctxt *ctxt, int count, - struct llog_logid *logid, struct llog_gen *gen, - struct obd_uuid *uuid); +int llog_obd_repl_connect(struct llog_ctxt *ctxt, int count, + struct llog_logid *logid, struct llog_gen *gen, + struct obd_uuid *uuid); struct llog_operations { int (*lop_write_rec)(struct llog_handle *loghandle, @@ -234,6 +263,73 @@ struct llog_ctxt { void *llog_proc_cb; }; +#define LCM_NAME_SIZE 64 + +struct llog_commit_master { + /** + * Thread control flags (start, stop, etc.) + */ + long lcm_flags; + /** + * Number of llcds onthis lcm. + */ + atomic_t lcm_count; + /** + * Ptlrpc requests set. All cancel rpcs go via this request set. + */ + struct ptlrpc_request_set *lcm_set; + /** + * Thread control structure. Used for control commit thread. + */ + struct ptlrpcd_ctl lcm_pc; + /** + * Busy resources waitq + */ + cfs_waitq_t lcm_waitq; + /** + * Commit thread name buffer. Only used for thread start. + */ + char lcm_name[LCM_NAME_SIZE]; +}; + +struct llog_canceld_ctxt { + /** + * Llog context this llcd is attached to. Used for accessing + * ->loc_import and others in process of canceling cookies + * gathered in this llcd. + */ + struct llog_ctxt *llcd_ctxt; + /** + * Cancel thread control stucture pointer. Used for accessing + * it to see if should stop processing and other needs. + */ + struct llog_commit_master *llcd_lcm; + /** + * Maximal llcd size. Used in calculations on how much of room + * left in llcd to cookie comming cookies. + */ + int llcd_size; + /** + * Current llcd size while gathering cookies. This should not be + * more than ->llcd_size. Used for determining if we need to + * send this llcd (if full) and allocate new one. This is also + * used for copying new cookie at the end of buffer. + */ + int llcd_cookiebytes; + /** + * Pointer to the start of cookies buffer. + */ + struct llog_cookie llcd_cookies[0]; +}; + +/* ptlrpc/recov_thread.c */ +extern struct llog_commit_master *llog_recov_thread_init(char *name); +extern void llog_recov_thread_fini(struct llog_commit_master *lcm, + int force); +extern int llog_recov_thread_start(struct llog_commit_master *lcm); +extern void llog_recov_thread_stop(struct llog_commit_master *lcm, + int force); + #ifndef __KERNEL__ #define cap_raise(c, flag) do {} while(0) @@ -308,10 +404,10 @@ static inline int llog_data_len(int len) do { \ if ((ctxt) == NULL) \ break; \ - CDEBUG(D_INFO, "PUTting ctxt %p : new refcount %d\n", (ctxt), \ - atomic_read(&(ctxt)->loc_refcount) - 1); \ LASSERT(atomic_read(&(ctxt)->loc_refcount) > 0); \ LASSERT(atomic_read(&(ctxt)->loc_refcount) < 0x5a5a5a); \ + CDEBUG(D_INFO, "PUTting ctxt %p : new refcount %d\n", (ctxt), \ + atomic_read(&(ctxt)->loc_refcount) - 1); \ __llog_ctxt_put(ctxt); \ } while (0) -- 1.8.3.1