23 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_BE 99 m0_be_fmt_log_header_size_max(
NULL);
172 m0_be_fmt_log_header_fini(&log->
lg_header);
194 .
ml_name =
"M0_BE_LOG_LEVEL_INIT",
199 .ml_name =
"M0_BE_LOG_LEVEL_LOG_SCHED",
204 .ml_name =
"M0_BE_LOG_LEVEL_LOG_STORE",
209 .ml_name =
"M0_BE_LOG_LEVEL_HEADER_PREINIT",
214 .ml_name =
"M0_BE_LOG_LEVEL_HEADER",
219 .ml_name =
"M0_BE_LOG_LEVEL_RECOVERY",
224 .ml_name =
"M0_BE_LOG_LEVEL_ASSIGNS",
229 .ml_name =
"fully initialized",
325 }
while (lio !=
NULL);
355 return m0_be_fmt_log_record_footer_size_max(
NULL);
369 for (
i = 0;
i < lio_nr; ++
i) {
398 record->lgr_need_discard =
false;
417 record_tlink_del_fini(
record);
420 for (
i = 0;
i <
record->lgr_io_nr; ++
i) {
450 record_tlink_del_fini(
record);
454 m0_be_fmt_log_record_footer_reset(&
record->lgr_footer);
456 for (
i = 0;
i <
record->lgr_io_nr; ++
i) {
461 record->lgr_need_discard =
false;
462 record->lgr_write_header =
false;
485 record->lgr_need_discard = need_discard;
487 for (
i = 0;
i <
header->lrh_io_size.lrhs_nr; ++
i) {
489 header->lrh_io_size.lrhs_size[
i]);
579 size_max =
m0_align(size_max, 1ULL << bshift);
623 rc = m0_be_fmt_log_record_footer_init(&
record->lgr_footer,
NULL);
633 m0_be_fmt_log_record_footer_fini(&
record->lgr_footer);
674 uint64_t
align = 1ULL << bshift;
694 record->lgr_need_discard =
true;
703 for (
i = 0;
i <
record->lgr_io_nr; ++
i) {
708 size_lio +=
i ==
record->lgr_io_nr - 1 ?
713 memset(addr_zero, 0xCC, size_lio_aligned - size_lio);
714 size_lio = size_lio_aligned;
735 if (size_reserved !=
size)
741 for (
i = 0;
i <
record->lgr_io_nr; ++
i) {
743 record->lgr_io[
i]->lio_buf_size);
750 size_fmt = m0_be_fmt_log_record_header_size(
header);
753 m0_be_fmt_log_record_header_encode(
header, &
cur);
759 size_fmt = m0_be_fmt_log_record_footer_size(
footer);
765 m0_be_fmt_log_record_footer_encode(
footer, &
cur);
777 record->lgr_write_header =
true;
788 if (size <= log->lg_cfg.lc_full_threshold &&
813 if (
record->lgr_write_header) {
820 for (
i = 0;
i <
record->lgr_io_nr; ++
i) {
840 return record->lgr_position;
847 return record->lgr_log_header_discarded;
894 discarded, lsn,
size);
896 m0_be_fmt_log_header_reset(hdr);
920 record->lgr_position != 0) {
947 rc = m0_be_fmt_log_header_encode_buf(log_hdr,
buf);
957 bool need_repair =
false;
1004 rc = m0_be_fmt_log_header_decode_buf(&hdrs[
i],
buf,
1015 if (hdrs[
i] !=
NULL)
1016 m0_be_fmt_log_header_decoded_free(hdrs[
i]);
1062 return ergo(pos == 0, prev == 0 && discarded == 0) &&
1063 ergo(pos != 0, prev < pos && discarded <= pos) &&
1080 dest->lrh_size =
src->lrh_size;
1081 dest->lrh_discarded =
src->lrh_discarded;
1082 dest->lrh_prev_pos =
src->lrh_prev_pos;
1083 dest->lrh_prev_size =
src->lrh_prev_size;
1084 for (
i = 0;
i <
src->lrh_io_size.lrhs_nr; ++
i)
1085 dest->lrh_io_size.lrhs_size[
i] =
src->lrh_io_size.lrhs_size[
i];
1086 dest->lrh_io_size.lrhs_nr =
src->lrh_io_size.lrhs_nr;
1100 uint64_t
align = 1ULL << bshift;
1117 rc =
rc ?: m0_be_fmt_log_record_header_decode(&
header, &
cur,
1136 rc =
rc ?: m0_be_fmt_log_record_footer_decode(&
footer, &
cur,
1140 m0_be_fmt_log_record_footer_decoded_free(
footer);
1146 m0_be_fmt_log_record_header_decoded_free(
header);
1174 rc = (pos == 0 &&
size == 0) ? -ENOENT : 0;
1240 #undef M0_TRACE_SUBSYSTEM
M0_INTERNAL void m0_be_log_record_io_size_set(struct m0_be_log_record *record, int index, m0_bcount_t size)
#define M0_BUFVEC_INIT_BUF(addr_ptr, count_ptr)
M0_INTERNAL void m0_be_log_store_rbuf_io_reset(struct m0_be_log_store *ls, enum m0_be_log_store_io_type io_type)
m0_bcount_t lg_prev_record_size
M0_INTERNAL struct m0_bufvec * m0_be_log_record_io_bufvec(struct m0_be_log_record *record, int index)
static int be_log_read_plain(struct m0_be_log *log, m0_bindex_t pos, m0_bcount_t size, void *out)
#define M0_BE_FMT_DECODE_CFG_DEFAULT
struct m0_be_fmt_log_record_header lri_header
M0_INTERNAL void m0_be_log_store_close(struct m0_be_log_store *ls)
M0_INTERNAL void m0_mutex_unlock(struct m0_mutex *mutex)
static m0_bcount_t be_log_record_header_size(void)
static struct m0_be_log * be_log_module2log(struct m0_module *module)
struct m0_be_op lg_header_read_op
M0_INTERNAL void m0_be_recovery_init(struct m0_be_recovery *rvr, struct m0_be_recovery_cfg *cfg)
M0_INTERNAL int m0_be_log_record_iter_init(struct m0_be_log_record_iter *iter)
M0_INTERNAL int m0_be_log_store_open(struct m0_be_log_store *ls, struct m0_be_log_store_cfg *ls_cfg)
static struct buffer * cur(struct m0_addb2_mach *mach, m0_bcount_t space)
struct m0_be_log_record * lio_record
M0_INTERNAL bool m0_be_log_recovery_record_available(struct m0_be_log *log)
static unsigned align(FILE *file, uint64_t align, uint64_t pos)
struct m0_be_recovery_cfg lc_recovery_cfg
M0_INTERNAL int m0_be_log_record_allocate(struct m0_be_log_record *record)
M0_INTERNAL int m0_be_log_record_initial(struct m0_be_log *log, struct m0_be_log_record_iter *curr)
M0_INTERNAL void m0_be_log_record_io_launch(struct m0_be_log_record *record, struct m0_be_op *op)
#define M0_LOG(level,...)
enum m0_trace_level level
struct m0_bufvec lio_bufvec
struct m0_be_log_store lg_store
M0_INTERNAL bool m0_be_recovery_log_record_available(struct m0_be_recovery *rvr)
struct m0_be_log_sched_cfg lc_sched_cfg
M0_INTERNAL int m0_be_log_open(struct m0_be_log *log, struct m0_be_log_cfg *log_cfg)
M0_INTERNAL struct m0_buf * m0_be_log_store_rbuf_read_buf_first(struct m0_be_log_store *ls, unsigned *iter)
m0_bcount_t brec_last_record_size
static void be_log_record_io_done_cb(struct m0_be_op *op, void *param)
M0_INTERNAL bool m0_be_fmt_log_record_header__invariant(struct m0_be_fmt_log_record_header *header, struct m0_be_log *log)
M0_INTERNAL m0_bindex_t m0_be_log_recovery_discarded(struct m0_be_log *log)
M0_INTERNAL struct m0_buf * m0_be_log_store_rbuf_read_buf_next(struct m0_be_log_store *ls, unsigned *iter)
M0_INTERNAL m0_bcount_t m0_be_log_reserved_size(struct m0_be_log *log, m0_bcount_t *lio_size, int lio_nr)
M0_INTERNAL void m0_be_fmt_log_record_header_fini(struct m0_be_fmt_log_record_header *obj)
M0_INTERNAL void m0_be_log_record_io_prepare(struct m0_be_log_record *record, enum m0_stob_io_opcode opcode, m0_bcount_t size_reserved)
M0_INTERNAL void m0_free_aligned(void *data, size_t size, unsigned shift)
M0_INTERNAL void m0_be_recovery_fini(struct m0_be_recovery *rvr)
M0_INTERNAL int m0_be_log_record_prev(struct m0_be_log *log, const struct m0_be_log_record_iter *curr, struct m0_be_log_record_iter *prev)
M0_INTERNAL struct m0 * m0_get(void)
m0_bindex_t lri_log_header_discarded
static void be_log_header_io(struct m0_be_log *log, enum m0_be_log_store_io_type io_type, struct m0_be_op *op)
static void be_log_header_update(struct m0_be_log *log)
M0_INTERNAL void m0_be_op_callback_set(struct m0_be_op *op, m0_be_op_cb_t cb, void *param, enum m0_be_op_state state)
#define container_of(ptr, type, member)
M0_INTERNAL void m0_mutex_lock(struct m0_mutex *mutex)
M0_INTERNAL m0_bcount_t m0_be_log_store_buf_size(struct m0_be_log_store *ls)
#define M0_EXT(start, end)
static int be_log_module_init(struct m0_be_log *log, struct m0_be_log_cfg *log_cfg, bool create_mode)
struct m0_module lg_module
static void be_log_module_fini(struct m0_be_log *log, bool destroy_mode)
M0_INTERNAL struct m0_be_log_io * m0_be_log_store_rbuf_io_first(struct m0_be_log_store *ls, enum m0_be_log_store_io_type io_type, struct m0_be_op **op, unsigned *iter)
M0_INTERNAL m0_bindex_t m0_be_log_record_discarded(const struct m0_be_log_record *record)
M0_INTERNAL void m0_be_fmt_log_record_header_reset(struct m0_be_fmt_log_record_header *obj)
M0_INTERNAL int m0_be_log_record_io_create(struct m0_be_log_record *record, m0_bcount_t size_max)
M0_INTERNAL void m0_be_log_module_setup(struct m0_be_log *log, struct m0_be_log_cfg *lg_cfg, bool create_mode)
M0_INTERNAL bool m0_be_log_header__repair(struct m0_be_fmt_log_header **hdrs, int nr, struct m0_be_fmt_log_header *out)
M0_INTERNAL void m0_be_io_configure(struct m0_be_io *bio, enum m0_stob_io_opcode opcode)
M0_INTERNAL void m0_be_io_err_send(uint32_t errcode, uint8_t location, uint8_t io_opcode)
struct m0_be_recovery lg_recovery
M0_INTERNAL void m0_be_log_store_io_translate(struct m0_be_log_store *ls, m0_bindex_t position, struct m0_be_io *bio)
static m0_bcount_t be_log_record_footer_size(void)
M0_INTERNAL int m0_be_log_record_next(struct m0_be_log *log, const struct m0_be_log_record_iter *curr, struct m0_be_log_record_iter *next)
#define M0_RC_INFO(rc, fmt,...)
struct m0_be_log_store_cfg lc_store_cfg
M0_INTERNAL void m0_be_io_add_nostob(struct m0_be_io *bio, void *ptr_user, m0_bindex_t offset_stob, m0_bcount_t size)
M0_INTERNAL void m0_be_io_fini(struct m0_be_io *bio)
M0_INTERNAL void m0_be_log_record_assign(struct m0_be_log_record *record, struct m0_be_log_record_iter *iter, bool need_discard)
struct m0_mutex * lc_lock
return M0_ERR(-EOPNOTSUPP)
M0_INTERNAL void m0_be_fmt_log_record_header_io_size_add(struct m0_be_fmt_log_record_header *obj, m0_bcount_t size)
m0_bindex_t lg_prev_record
M0_INTERNAL void m0_be_log_close(struct m0_be_log *log)
M0_INTERNAL bool m0_be_log_sched_is_locked(struct m0_be_log_sched *sched)
#define M0_BE_OP_SYNC_RET(op_obj, action, member)
static int be_log_record_header_init(struct m0_be_fmt_log_record_header *hdr)
M0_INTERNAL bool m0_be_log__invariant(struct m0_be_log *log)
m0_bindex_t brec_discarded
M0_INTERNAL bool m0_mutex_is_locked(const struct m0_mutex *mutex)
static bool m0_is_aligned(uint64_t val, uint64_t alignment)
m0_bindex_t brec_last_record_pos
M0_INTERNAL void m0_be_log_sched_add(struct m0_be_log_sched *sched, struct m0_be_log_io *lio, struct m0_be_op *op)
m0_be_log_got_space_cb_t lg_got_space_cb
static int be_log_header_write(struct m0_be_log *log, struct m0_be_fmt_log_header *log_hdr)
m0_bindex_t flh_discarded
struct m0_be_log * brc_log
M0_INTERNAL void m0_be_log_io_deallocate(struct m0_be_log_io *lio)
M0_INTERNAL bool m0_be_log_store_contains_stob(struct m0_be_log_store *ls, const struct m0_stob_id *stob_id)
static struct m0_bufvec bvec
M0_INTERNAL struct m0_be_log_io * m0_be_log_store_rbuf_io_next(struct m0_be_log_store *ls, enum m0_be_log_store_io_type io_type, struct m0_be_op **op, unsigned *iter)
M0_INTERNAL void m0_be_log_record_fini(struct m0_be_log_record *record)
M0_INTERNAL void m0_bufvec_cursor_init(struct m0_bufvec_cursor *cur, const struct m0_bufvec *bvec)
M0_INTERNAL void m0_module_setup(struct m0_module *module, const char *name, const struct m0_modlev *level, int level_nr, struct m0 *instance)
M0_INTERNAL int m0_be_io_init(struct m0_be_io *bio)
m0_be_log_got_space_cb_t lc_got_space_cb
struct m0_mutex lg_record_state_lock
M0_INTERNAL int m0_be_log_create(struct m0_be_log *log, struct m0_be_log_cfg *log_cfg)
M0_INTERNAL void m0_mutex_init(struct m0_mutex *mutex)
static void be_log_header_io_sync(struct m0_be_log *log, enum m0_be_log_store_io_type io_type)
M0_INTERNAL void m0_be_log_header__set(struct m0_be_fmt_log_header *hdr, m0_bindex_t discarded, m0_bindex_t lsn, m0_bcount_t size)
static int be_log_record_iter_read(struct m0_be_log *log, struct m0_be_log_record_iter *iter, m0_bindex_t pos)
M0_INTERNAL void m0_be_log_record_discard(struct m0_be_log *log, m0_bcount_t size)
M0_INTERNAL void m0_be_op_done(struct m0_be_op *op)
static void be_log_level_leave(struct m0_module *module)
M0_INTERNAL int m0_be_fmt_log_record_header_init(struct m0_be_fmt_log_record_header *obj, const struct m0_be_fmt_log_record_header_cfg *cfg)
M0_INTERNAL void m0_be_log_record_reset(struct m0_be_log_record *record)
struct m0_mutex * lg_external_lock
#define M0_BE_IO_CREDIT(reg_nr, reg_size, part_nr)
M0_INTERNAL struct m0_bufvec * m0_be_log_io_bufvec(struct m0_be_log_io *lio)
static void be_log_io_credit(struct m0_be_log *log, struct m0_be_io_credit *accum)
M0_INTERNAL int m0_be_log_reserve(struct m0_be_log *log, m0_bcount_t size)
M0_INTERNAL void m0_be_recovery_log_record_get(struct m0_be_recovery *rvr, struct m0_be_log_record_iter *iter)
M0_INTERNAL bool m0_be_log_store_overwrites(struct m0_be_log_store *ls, m0_bindex_t index, m0_bcount_t size, m0_bindex_t position)
m0_bcount_t flh_group_size
M0_INTERNAL int m0_be_log_io_allocate(struct m0_be_log_io *lio, struct m0_be_io_credit *iocred, uint32_t log_bshift)
M0_INTERNAL void m0_be_log_recovery_record_get(struct m0_be_log *log, struct m0_be_log_record_iter *iter)
struct m0_be_op lg_header_write_op
struct m0_be_log_cfg lg_cfg
M0_INTERNAL void m0_be_op_reset(struct m0_be_op *op)
M0_INTERNAL int m0_be_log_io_init(struct m0_be_log_io *lio)
m0_bindex_t flh_group_lsn
M0_INTERNAL void m0_be_op_active(struct m0_be_op *op)
M0_INTERNAL m0_bindex_t m0_be_log_record_position(const struct m0_be_log_record *record)
M0_INTERNAL struct m0_buf * m0_be_log_store_rbuf_write_buf(struct m0_be_log_store *ls)
M0_INTERNAL int m0_be_io_allocate(struct m0_be_io *bio, struct m0_be_io_credit *iocred)
#define M0_ALLOC_PTR(ptr)
M0_INTERNAL void m0_be_io_deallocate(struct m0_be_io *bio)
M0_INTERNAL bool m0_be_log_header__is_eq(struct m0_be_fmt_log_header *hdr1, struct m0_be_fmt_log_header *hdr2)
m0_bcount_t lsc_rbuf_size
M0_INTERNAL void m0_be_log_destroy(struct m0_be_log *log)
M0_INTERNAL void m0_be_log_record_iter_copy(struct m0_be_log_record_iter *dest, struct m0_be_log_record_iter *src)
M0_INTERNAL m0_bcount_t m0_be_fmt_log_record_header_size_max(const struct m0_be_fmt_log_record_header_cfg *cfg)
m0_bcount_t lg_unplaced_size
M0_INTERNAL int m0_be_log_header_read(struct m0_be_log *log, struct m0_be_fmt_log_header *log_hdr)
M0_INTERNAL int m0_be_log_store_create(struct m0_be_log_store *ls, struct m0_be_log_store_cfg *ls_cfg)
M0_INTERNAL void m0_be_op_fini(struct m0_be_op *op)
M0_INTERNAL void m0_mutex_fini(struct m0_mutex *mutex)
M0_INTERNAL void m0_be_op_set_add(struct m0_be_op *parent, struct m0_be_op *child)
m0_be_log_full_cb_t lc_full_cb
M0_INTERNAL void m0_be_log_record_iter_fini(struct m0_be_log_record_iter *iter)
#define M0_ASSERT_INFO(cond, fmt,...)
M0_INTERNAL void m0_be_log_sched_fini(struct m0_be_log_sched *sched)
static void be_log_record_header_copy(struct m0_be_fmt_log_record_header *dest, struct m0_be_fmt_log_record_header *src)
M0_INTERNAL void m0_be_log_store_io_credit(struct m0_be_log_store *ls, struct m0_be_io_credit *accum)
struct m0_be_io lio_be_io
M0_INTERNAL void m0_be_log_record_deallocate(struct m0_be_log_record *record)
M0_INTERNAL void * m0_alloc_aligned(size_t size, unsigned shift)
M0_INTERNAL void m0_be_log_io_fini(struct m0_be_log_io *lio)
M0_TL_DEFINE(record, static, struct m0_be_log_record)
M0_INTERNAL int m0_be_recovery_run(struct m0_be_recovery *rvr)
struct m0_be_log_sched lg_sched
static int be_log_level_enter(struct m0_module *module)
M0_INTERNAL bool m0_be_log_contains_stob(struct m0_be_log *log, const struct m0_stob_id *stob_id)
M0_INTERNAL void m0_be_log_record_skip_discard(struct m0_be_log_record *record)
M0_INTERNAL void m0_be_log_sched_lock(struct m0_be_log_sched *sched)
M0_INTERNAL void m0_be_op_init(struct m0_be_op *op)
m0_bindex_t lg_unplaced_pos
M0_INTERNAL void m0_be_io_launch(struct m0_be_io *bio, struct m0_be_op *op)
M0_INTERNAL void m0_be_log_record_init(struct m0_be_log_record *record, struct m0_be_log *log)
struct m0_pdclust_src_addr src
M0_INTERNAL void m0_be_log_sched_unlock(struct m0_be_log_sched *sched)
M0_TL_DESCR_DEFINE(record, "be log records", static, struct m0_be_log_record, lgr_linkage, lgr_magic, M0_BE_LOG_RECORD_MAGIC, M0_BE_LOG_RECORD_HEAD_MAGIC)
M0_INTERNAL uint32_t m0_be_log_bshift(struct m0_be_log *log)
static uint64_t m0_align(uint64_t val, uint64_t alignment)
M0_INTERNAL void m0_be_log_store_destroy(struct m0_be_log_store *ls)
static const struct m0_modlev be_log_levels[]
M0_INTERNAL void m0_module_fini(struct m0_module *module, int level)
M0_INTERNAL int m0_be_log_sched_init(struct m0_be_log_sched *sched, struct m0_be_log_sched_cfg *cfg)
M0_INTERNAL void m0_be_log_io_reset(struct m0_be_log_io *lio)
M0_INTERNAL void m0_be_log_record_ext(struct m0_be_log_record *record, struct m0_ext *ext)
M0_INTERNAL void m0_be_op_wait(struct m0_be_op *op)
struct m0_be_fmt_log_header lg_header
M0_INTERNAL int m0_module_init(struct m0_module *module, int level)
M0_INTERNAL void m0_be_log_unreserve(struct m0_be_log *log, m0_bcount_t size)
#define M0_IMPOSSIBLE(fmt,...)
M0_INTERNAL uint32_t m0_be_log_store_bshift(struct m0_be_log_store *ls)