25 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_BE 58 #define BE_TX_LOCKED_AT_STATE(tx, states) \ 60 const struct m0_be_tx *__tx = (tx); \ 62 _0C(be_tx_is_locked(__tx)) && m0_be_tx__invariant(__tx) && \ 63 _0C(M0_IN(m0_be_tx_state(__tx), states)); \ 116 .sd_name =
"prepare",
121 .sd_name =
"opening",
126 .sd_name =
"grouping",
206 .t_persistent = persistent,
207 .t_discarded = discarded,
210 .t_payload_prepared = 0,
212 .t_gc_enabled =
false,
215 .t_exclusive =
false,
216 .t_recovering =
false,
226 .sa_datum = (
void *) state,
470 M0_ENTRY(
"tx=%p t_gc_free=%p t_gc_param=%p",
476 gc_free(tx, gc_param);
485 bool tx_is_freed =
false;
583 "tx=%p rc=%d state=%s",
620 "rc = %d, tx = %p",
rc, tx);
709 max.tc_reg_size /= fraction;
710 max.tc_reg_nr /= fraction;
792 #undef BE_TX_LOCKED_AT_STATE 795 #undef M0_TRACE_SUBSYSTEM
struct m0_be_tx_credit t_prepared
static struct m0_sm_trans_descr be_tx_sm_trans[]
M0_INTERNAL void m0_be_tx_close_sync(struct m0_be_tx *tx)
M0_INTERNAL void m0_sm_conf_init(struct m0_sm_conf *conf)
M0_INTERNAL int m0_sm_addb2_init(struct m0_sm_conf *conf, uint64_t id, uint64_t counter)
M0_INTERNAL void m0_be_tx_lsn_set(struct m0_be_tx *tx, m0_bindex_t lsn, m0_bindex_t lsn_discarded)
static void be_tx_ast_cb(struct m0_sm_group *sm_group, struct m0_sm_ast *ast)
void(* sa_cb)(struct m0_sm_group *grp, struct m0_sm_ast *)
const m0_time_t M0_TIME_NEVER
static void be_tx_gc(struct m0_be_tx *tx)
static struct m0_sm_ast * be_tx_ast(struct m0_be_tx *tx, enum m0_be_tx_state state)
#define M0_LOG(level,...)
M0_INTERNAL bool m0_be_reg_area__invariant(const struct m0_be_reg_area *ra)
M0_INTERNAL void m0_be_tx__recovering_set(struct m0_be_tx *tx)
M0_INTERNAL void m0_sm_ast_post(struct m0_sm_group *grp, struct m0_sm_ast *ast)
struct m0_be_tx_credit bra_prepared
static void be_tx_state_move(struct m0_be_tx *tx, enum m0_be_tx_state state, int rc)
const struct m0_be_tx_credit m0_be_tx_credit_invalid
M0_INTERNAL void m0_be_tx_exclusive_open(struct m0_be_tx *tx)
M0_INTERNAL struct m0_be_reg_area * m0_be_tx__reg_area(struct m0_be_tx *tx)
static struct m0_addb2_mach * mach
M0_INTERNAL struct m0_be_seg * m0_be_domain_seg_by_addr(struct m0_be_domain *dom, void *addr)
#define container_of(ptr, type, member)
M0_ADDB2_ADD(M0_AVI_FS_CREATE, new_fid.f_container, new_fid.f_key, mode, rc)
M0_INTERNAL bool m0_sm_addb2_counter_init(struct m0_sm *sm)
M0_INTERNAL int m0_be_tx_open_sync(struct m0_be_tx *tx)
M0_INTERNAL unsigned long m0_be_reg_gen_idx(const struct m0_be_reg *reg)
static int be_tx_memory_allocate(struct m0_be_tx *tx)
M0_INTERNAL void m0_be_tx_prep(struct m0_be_tx *tx, const struct m0_be_tx_credit *credit)
M0_INTERNAL void m0_be_tx_put(struct m0_be_tx *tx)
#define M0_BE_REG(seg, size, addr)
M0_INTERNAL int m0_be_engine__exclusive_open_invariant(struct m0_be_engine *en, struct m0_be_tx *excl)
m0_bcount_t bra_area_used
#define M0_BE_REG_D(reg, buf)
M0_INTERNAL void m0_be_reg_area_capture(struct m0_be_reg_area *ra, struct m0_be_reg_d *rd)
bool m0_be_reg__invariant(const struct m0_be_reg *reg)
M0_INTERNAL bool m0_be_tx__is_fast(struct m0_be_tx *tx)
M0_INTERNAL int m0_sm_timedwait(struct m0_sm *mach, uint64_t states, m0_time_t deadline)
M0_INTERNAL void m0_be_reg_area_fini(struct m0_be_reg_area *ra)
M0_INTERNAL int m0_be_reg_area_init(struct m0_be_reg_area *ra, const struct m0_be_tx_credit *prepared, enum m0_be_reg_area_type type)
m0_be_tx_cb_t t_discarded
#define M0_BE_FMT_TX(payload, id)
struct m0_be_domain * t_dom
static struct m0_sm_ast ast[NR]
M0_INTERNAL void * m0_alloc_nz(size_t size)
M0_EXTERN struct m0_sm_conf op_states_conf
M0_INTERNAL struct m0_be_engine * m0_be_domain_engine(struct m0_be_domain *dom)
M0_INTERNAL bool m0_be_tx_credit_eq(const struct m0_be_tx_credit *c0, const struct m0_be_tx_credit *c1)
M0_INTERNAL void m0_be_tx_deconstruct(struct m0_be_tx *tx, struct m0_be_fmt_tx *ftx)
struct m0_be_tx_group * t_group
M0_INTERNAL void m0_be_engine__tx_state_set(struct m0_be_engine *en, struct m0_be_tx *tx, enum m0_be_tx_state state)
struct m0_be_tx_credit bra_captured
static void be_tx_state_move_ast(struct m0_be_tx *tx, enum m0_be_tx_state state)
static void tx_state(struct m0_addb2__context *ctx, const uint64_t *v, char *buf)
M0_INTERNAL bool m0_mutex_is_locked(const struct m0_mutex *mutex)
M0_INTERNAL void m0_be_tx__group_assign(struct m0_be_tx *tx, struct m0_be_tx_group *gr)
M0_INTERNAL void m0_be_tx_credit_add(struct m0_be_tx_credit *c0, const struct m0_be_tx_credit *c1)
M0_INTERNAL void m0_be_tx_open(struct m0_be_tx *tx)
static struct m0_stob_domain * dom
static long long max(long long a, long long b)
m0_bcount_t t_payload_prepared
struct m0_sm_group * sm_grp
M0_INTERNAL int m0_be_tx_exclusive_open_sync(struct m0_be_tx *tx)
M0_INTERNAL void m0_sm_addb2_fini(struct m0_sm_conf *conf)
M0_INTERNAL bool m0_be_tx__is_exclusive(const struct m0_be_tx *tx)
static bool be_should_break(struct m0_be_engine *eng, uint64_t fraction, const struct m0_be_tx_credit *accum, const struct m0_be_tx_credit *delta)
m0_bindex_t t_lsn_discarded
M0_INTERNAL void m0_be_tx_lsn_get(struct m0_be_tx *tx, m0_bindex_t *lsn, m0_bindex_t *lsn_discarded)
M0_INTERNAL bool m0_be_should_break_half(struct m0_be_engine *eng, const struct m0_be_tx_credit *accum, const struct m0_be_tx_credit *delta)
static void be_tx_make_reg_d(struct m0_be_tx *tx, struct m0_be_reg_d *rd, const struct m0_be_reg *reg)
struct m0_buf bft_payload
M0_INTERNAL int m0_buf_copy(struct m0_buf *dest, const struct m0_buf *src)
M0_INTERNAL void m0_be_tx_close(struct m0_be_tx *tx)
M0_INTERNAL void m0_be_engine__tx_fini(struct m0_be_engine *en, struct m0_be_tx *tx)
M0_INTERNAL void m0_be_engine_tx_size_max(struct m0_be_engine *en, struct m0_be_tx_credit *cred, m0_bcount_t *payload_size)
static struct m0_sm_state_descr be_tx_states[M0_BTS_NR]
#define BE_TX_LOCKED_AT_STATE(tx, states)
M0_INTERNAL enum m0_be_tx_state m0_be_tx_state(const struct m0_be_tx *tx)
M0_INTERNAL void m0_be_reg_area_uncapture(struct m0_be_reg_area *ra, const struct m0_be_reg_d *rd)
M0_INTERNAL int m0_be_tx_timedwait(struct m0_be_tx *tx, uint64_t states, m0_time_t deadline)
M0_INTERNAL void m0_be_tx_mod_fini(void)
static bool be_tx_state_invariant(const struct m0_sm *mach)
M0_INTERNAL void m0_be_tx_init(struct m0_be_tx *tx, uint64_t tid, struct m0_be_domain *dom, struct m0_sm_group *sm_group, m0_be_tx_cb_t persistent, m0_be_tx_cb_t discarded, void(*filler)(struct m0_be_tx *tx, void *payload), void *datum)
M0_INTERNAL void m0_sm_init(struct m0_sm *mach, const struct m0_sm_conf *conf, uint32_t state, struct m0_sm_group *grp)
M0_INTERNAL void m0_be_tx_reconstruct(struct m0_be_tx *tx, const struct m0_be_fmt_tx *ftx)
void(* t_gc_free)(struct m0_be_tx *tx, void *param)
M0_INTERNAL void m0_be_tx_get(struct m0_be_tx *tx)
M0_INTERNAL void m0_be_tx_fini(struct m0_be_tx *tx)
m0_be_tx_cb_t t_persistent
M0_INTERNAL void m0_be_tx_uncapture(struct m0_be_tx *tx, const struct m0_be_reg *reg)
M0_INTERNAL void m0_sm_move(struct m0_sm *mach, int32_t rc, int state)
M0_INTERNAL bool m0_be_should_break(struct m0_be_engine *eng, const struct m0_be_tx_credit *accum, const struct m0_be_tx_credit *delta)
#define IS_IN_ARRAY(idx, array)
M0_INTERNAL void m0_be_engine__tx_force(struct m0_be_engine *en, struct m0_be_tx *tx)
static bool be_tx_is_locked(const struct m0_be_tx *tx)
M0_INTERNAL bool m0_be_tx__is_recovering(struct m0_be_tx *tx)
M0_INTERNAL void m0_be_tx_gc_enable(struct m0_be_tx *tx, void(*gc_free)(struct m0_be_tx *, void *param), void *param)
static struct m0_be_seg * seg
static void addb2_add_tx_attrs(const struct m0_be_tx *tx)
#define M0_ASSERT_INFO(cond, fmt,...)
M0_INTERNAL const char * m0_be_tx_state_name(enum m0_be_tx_state state)
M0_INTERNAL void m0_be_tx_payload_prep(struct m0_be_tx *tx, m0_bcount_t size)
M0_INTERNAL void m0_sm_ast_cancel(struct m0_sm_group *grp, struct m0_sm_ast *ast)
M0_INTERNAL bool m0_be_tx_credit_le(const struct m0_be_tx_credit *c0, const struct m0_be_tx_credit *c1)
M0_INTERNAL int m0_be_tx_fol_add(struct m0_be_tx *tx, struct m0_fol_rec *rec)
struct m0_be_reg_area t_reg_area
M0_INTERNAL void m0_sm_conf_fini(struct m0_sm_conf *conf)
M0_INTERNAL void m0_be_tx_capture(struct m0_be_tx *tx, const struct m0_be_reg *reg)
M0_INTERNAL uint64_t m0_sm_id_get(const struct m0_sm *sm)
M0_INTERNAL bool m0_be_tx__invariant(const struct m0_be_tx *tx)
M0_INTERNAL void m0_be_tx__state_post(struct m0_be_tx *tx, enum m0_be_tx_state state)
struct m0_be_seg * br_seg
M0_INTERNAL int m0_be_tx_mod_init(void)
void(* m0_be_tx_cb_t)(const struct m0_be_tx *tx)
#define offsetof(typ, memb)
static struct m0_sm_state_descr states[C_NR]
M0_INTERNAL void m0_be_tx_force(struct m0_be_tx *tx)
M0_INTERNAL void m0_be_engine__tx_init(struct m0_be_engine *en, struct m0_be_tx *tx, enum m0_be_tx_state state)
struct m0_be_engine * t_engine
M0_INTERNAL int m0_fol_rec_encode(struct m0_fol_rec *rec, struct m0_buf *at)
M0_INTERNAL const char * m0_sm_conf_state_name(const struct m0_sm_conf *conf, int state)
struct m0_sm_conf be_tx_sm_conf
static const ptrdiff_t be_tx_ast_offset[M0_BTS_NR+1]
M0_INTERNAL void m0_sm_fini(struct m0_sm *mach)