Details
-
Bug
-
Resolution: Fixed
-
Minor
-
Lustre 2.8.0
-
None
-
3
-
9223372036854775807
Description
During processing llog records, it needs to locate the record by the start_index, and if start_index is not zero, it will first try to skip some records to avoid reading too much useless records (see llog_process_thread). In current implementation, llog_skip_over will skip the record by LLOG_MIN_REC_SIZE, only 24 bytes, which is too less for update record (usually around 1000 bytes).
static inline void llog_skip_over(struct llog_log_hdr *llh, __u64 *off,
int curr, int goal, __u32 chunk_size)
{
if (goal > curr) {
if (llh->llh_size == 0) {
/* variable size records */
*off = *off + (goal - curr - 1) * LLOG_MIN_REC_SIZE;
} else {
*off = chunk_size + (goal - 1) * llh->llh_size;
}
}
/* always align with lower chunk boundary*/
*off &= ~(chunk_size - 1);
}
So we probably should record the minimum record size in llog_osd_write_rec() and remember it in llh_size (in llog header), which is only used by fixed size llog record for now.