25 #include <sys/types.h> 28 #include <sys/syscall.h> 31 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_UT 52 .
bt_name =
"m0_ut_be_backend_bobtype",
182 return syscall(SYS_gettid);
188 bool need_to_up_asts_run_sem;
193 need_to_up_asts_run_sem =
196 if (need_to_up_asts_run_sem)
255 #define M0_BE_LOG_NAME "M0_BE:LOG" 256 #define M0_BE_SEG0_NAME "M0_BE:SEG0" 257 #define M0_BE_SEG_NAME "M0_BE:SEG%08lu" 280 .tgc_tx_nr_max = 128,
281 .tgc_seg_nr_max = 256,
283 .tgc_payload_max = 1 << 24,
286 .bec_tx_payload_max = 1 << 21,
291 .bec_wait_for_recovery =
true,
305 .lsc_stob_domain_key =
308 .lsc_stob_create_cfg =
NULL,
309 .lsc_stob_dont_zero =
true,
314 .lsch_io_sched_cfg = {
317 .lc_full_threshold = 20 * (1 << 20),
318 .lc_skip_recovery =
false,
323 .bc_stob_domain_location =
"linuxstob:./be_segments",
324 .bc_stob_domain_cfg_init =
NULL,
326 .bc_mkfs_mode =
false,
327 .bc_stob_domain_cfg_create =
NULL,
332 .bsc_preallocate =
false,
334 .bsc_stob_create_cfg =
NULL,
339 .bpdc_seg_io_nr = 0x2,
341 .bc_log_discard_cfg = {
342 .ldsc_items_max = 0x100,
343 .ldsc_items_threshold = 0x80,
355 static bool mkfs_executed =
false;
360 if (!mkfs_executed && cfg ==
NULL &&
362 mkfs = mkfs_executed =
true;
378 if (
c->bc_engine.bec_reqh ==
NULL)
385 c->bc_mkfs_mode = mkfs;
391 if (!
c->bc_mkfs_mode &&
rc == -ENOENT) {
394 c->bc_mkfs_mode =
true;
422 c->bc_mkfs_mode =
true;
426 c->bc_log.lc_lock = &
dom->bd_engine_lock;
469 const char *stob_create_cfg,
475 .bsc_preallocate = preallocate,
477 .bsc_stob_create_cfg = stob_create_cfg,
651 .bsc_preallocate =
false,
653 .bsc_stob_create_cfg =
NULL,
765 #undef M0_TRACE_SUBSYSTEM
void m0_be_ut_backend_new_grp_lock_state_set(struct m0_be_ut_backend *ut_be, bool unlocked_new)
static void ptr(struct m0_addb2__context *ctx, const uint64_t *v, char *buf)
M0_INTERNAL void m0_chan_wait(struct m0_clink *link)
#define M0_ALLOC_ARR(arr, nr)
static void be_ut_tx_lock_if(struct m0_sm_group *grp, struct m0_be_ut_backend *ut_be)
M0_INTERNAL void m0_mutex_unlock(struct m0_mutex *mutex)
struct m0_sm_group * m0_be_ut_backend_sm_group_lookup(struct m0_be_ut_backend *ut_be)
struct m0_semaphore sgt_asts_run_sem
M0_INTERNAL void m0_be_seg_fini(struct m0_be_seg *seg)
M0_INTERNAL bool m0_semaphore_trydown(struct m0_semaphore *semaphore)
int m0_thread_join(struct m0_thread *q)
M0_INTERNAL int m0_be_domain_seg_create(struct m0_be_domain *dom, struct m0_be_tx *tx, const struct m0_be_0type_seg_cfg *seg_cfg, struct m0_be_seg **out)
#define M0_REQH_INIT(reqh,...)
static struct m0_sm_group * grp
M0_INTERNAL void * m0_be_ut_seg_allocate_addr(m0_bcount_t size)
M0_INTERNAL void m0_be_seg_init(struct m0_be_seg *seg, struct m0_stob *stob, struct m0_be_domain *dom, uint64_t seg_id)
struct m0_be_seg * bus_seg
M0_INTERNAL void m0_be_tx_fini(struct m0_be_tx *tx)
M0_INTERNAL int m0_be_seg_create(struct m0_be_seg *seg, m0_bcount_t size, void *addr)
#define M0_BE_OP_SYNC(op_obj, action)
struct m0_mutex but_sgt_lock
void m0_be_ut_seg_allocator_init(struct m0_be_ut_seg *ut_seg, struct m0_be_ut_backend *ut_be)
char * but_stob_domain_location
struct m0_be_0type m0_stob_ad_0type
M0_INTERNAL void m0_be_tx_prep(struct m0_be_tx *tx, const struct m0_be_tx_credit *credit)
struct m0_be_ut_seg ut_seg
#define M0_THREAD_INIT(thread, TYPE, init, func, arg, namefmt,...)
M0_INTERNAL void m0_be_ut_backend_seg_add2(struct m0_be_ut_backend *ut_be, m0_bcount_t size, bool preallocate, const char *stob_create_cfg, struct m0_be_seg **out)
M0_INTERNAL void m0_be_ut_reqh_create(struct m0_reqh **pptr)
#define container_of(ptr, type, member)
M0_INTERNAL void m0_mutex_lock(struct m0_mutex *mutex)
M0_INTERNAL void m0_reqh_fini(struct m0_reqh *reqh)
struct m0_be_0type m0_be_dtm0
M0_INTERNAL void m0_sm_group_fini(struct m0_sm_group *grp)
uint64_t bec_tx_active_max
bool but_sm_groups_unlocked
M0_INTERNAL void m0_be_seg_close(struct m0_be_seg *seg)
M0_INTERNAL void m0_be_domain_seg_destroy_credit(struct m0_be_domain *dom, struct m0_be_seg *seg, struct m0_be_tx_credit *cred)
void m0_be_ut_seg_init(struct m0_be_ut_seg *ut_seg, struct m0_be_ut_backend *ut_be, m0_bcount_t size)
#define M0_BE_TX_CREDIT(nr, size)
M0_INTERNAL int m0_pagesize_get(void)
M0_INTERNAL void m0_be_ut_backend_seg_del(struct m0_be_ut_backend *ut_be, struct m0_be_seg *seg)
struct m0_reqh * bec_reqh
void m0_be_ut_seg_reload(struct m0_be_ut_seg *ut_seg)
M0_INTERNAL void m0_sm_group_unlock(struct m0_sm_group *grp)
struct m0_mutex buh_seg_lock
static void be_ut_helper_fini(void)
M0_INTERNAL struct m0_stob * m0_ut_stob_linux_get(void)
M0_INTERNAL void m0_be_engine_got_log_space_cb(struct m0_be_log *log)
M0_INTERNAL int m0_be_ut_backend_init_cfg(struct m0_be_ut_backend *ut_be, const struct m0_be_domain_cfg *cfg, bool mkfs)
M0_INTERNAL void m0_bob_init(const struct m0_bob_type *bt, void *bob)
struct m0_be_ut_backend ut_be
void m0_be_ut_backend_thread_exit(struct m0_be_ut_backend *ut_be)
M0_INTERNAL void m0_be_log_close(struct m0_be_log *log)
#define M0_FID_TINIT(type, container, key)
struct m0_be_0type m0_be_cob0
const struct m0_fid_type cot_ftype
static struct m0_stob * stob
struct m0_be_0type m0_be_active_record0
void m0_be_ut_backend_sm_group_asts_run(struct m0_be_ut_backend *ut_be)
M0_INTERNAL void m0_sm_group_init(struct m0_sm_group *grp)
M0_INTERNAL void m0_be_ut_free(struct m0_be_ut_backend *ut_be, struct m0_be_ut_seg *ut_seg, void *ptr)
M0_INTERNAL void m0_be_ut_reqh_destroy(void)
static struct m0_addb2_callback c
M0_INTERNAL struct m0_be_allocator * m0_be_seg_allocator(struct m0_be_seg *seg)
M0_INTERNAL void m0_bob_fini(const struct m0_bob_type *bt, void *bob)
M0_INTERNAL void m0_be_ut_alloc(struct m0_be_ut_backend *ut_be, struct m0_be_ut_seg *ut_seg, void **ptr, m0_bcount_t size)
M0_INTERNAL void m0_be_alloc(struct m0_be_allocator *a, struct m0_be_tx *tx, struct m0_be_op *op, void **ptr, m0_bcount_t size)
void m0_thread_fini(struct m0_thread *q)
pthread_once_t buh_once_control
static struct m0_stob_domain * dom
static size_t be_ut_backend_sm_group_find(struct m0_be_ut_backend *ut_be)
M0_INTERNAL int m0_be_tx_open_sync(struct m0_be_tx *tx)
M0_INTERNAL struct m0_be_log * m0_be_domain_log(struct m0_be_domain *dom)
static void be_ut_helper_init_once(void)
M0_INTERNAL void m0_clink_signal(struct m0_clink *clink)
M0_INTERNAL int m0_semaphore_init(struct m0_semaphore *semaphore, unsigned value)
static pid_t gettid_impl(void)
M0_INTERNAL int m0_be_log_create(struct m0_be_log *log, struct m0_be_log_cfg *log_cfg)
struct m0_sm_group * sm_grp
struct m0_be_ut_sm_group_thread ** but_sgt
M0_INTERNAL void m0_mutex_init(struct m0_mutex *mutex)
static struct m0_sm_group * be_ut_backend_sm_group_lookup(struct m0_be_ut_backend *ut_be, bool lock_new)
M0_INTERNAL int m0_be_tx_exclusive_open_sync(struct m0_be_tx *tx)
void m0_be_ut_seg_fini(struct m0_be_ut_seg *ut_seg)
struct m0_reqh ** buh_reqh
struct m0_be_ut_backend * bus_backend
static void be_ut_sm_group_thread_func(struct m0_be_ut_sm_group_thread *sgt)
struct m0_net_xprt * buh_net_xprt
M0_INTERNAL void m0_be_allocator_destroy(struct m0_be_allocator *a, struct m0_be_tx *tx)
void m0_be_ut_seg_allocator_fini(struct m0_be_ut_seg *ut_seg, struct m0_be_ut_backend *ut_be)
static void be_ut_tx_unlock_if(struct m0_sm_group *grp, struct m0_be_ut_backend *ut_be)
struct m0_be_domain but_dom
M0_INTERNAL void m0_ut_stob_put(struct m0_stob *stob, bool destroy)
struct m0_semaphore sgt_stop_sem
static void m0_be_ut_sm_group_thread_fini(struct m0_be_ut_sm_group_thread *sgt)
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)
#define m0_forall(var, nr,...)
struct m0_module bd_module
int init(struct workload *w)
struct m0_be_domain_cfg but_dom_cfg
struct m0_sm_group sgt_grp
M0_INTERNAL int m0_be_ut_backend_log_resize(struct m0_be_ut_backend *ut_be, const struct m0_be_domain_cfg *cfg)
struct m0_rpc_server_ctx buh_rpc_sctx
M0_INTERNAL struct m0_locality * m0_locality0_get(void)
M0_INTERNAL void m0_be_domain_module_setup(struct m0_be_domain *dom, const struct m0_be_domain_cfg *cfg)
M0_INTERNAL void m0_be_free(struct m0_be_allocator *a, struct m0_be_tx *tx, struct m0_be_op *op, void *ptr)
#define M0_BE_UT_TRANSACT(__ut_be, __tx, __cred, __credit_func, __action_func)
#define M0_FI_ENABLED(tag)
void m0_be_ut_backend_fini(struct m0_be_ut_backend *ut_be)
#define M0_ALLOC_PTR(ptr)
static void be_ut_helper_init(void)
M0_INTERNAL void m0_semaphore_fini(struct m0_semaphore *semaphore)
const struct m0_bob_type m0_ut_be_backend_bobtype
M0_INTERNAL int m0_be_seg_destroy(struct m0_be_seg *seg)
M0_INTERNAL void m0_mutex_fini(struct m0_mutex *mutex)
void m0_be_ut_tx_init(struct m0_be_tx *tx, struct m0_be_ut_backend *ut_be)
M0_INTERNAL uint64_t m0_be_ut_seg_allocate_id(void)
M0_INTERNAL int m0_be_seg_open(struct m0_be_seg *seg)
M0_INTERNAL void m0_sm_group_lock(struct m0_sm_group *grp)
static struct m0_be_seg * seg
struct m0_thread sgt_thread
M0_INTERNAL int m0_be_allocator_create(struct m0_be_allocator *a, struct m0_be_tx *tx, uint32_t *zone_percent, uint32_t zones_nr)
M0_INTERNAL void m0_be_engine_full_log_cb(struct m0_be_log *log)
M0_INTERNAL int m0_be_allocator_init(struct m0_be_allocator *a, struct m0_be_seg *seg)
M0_INTERNAL void be_domain_log_cleanup(const char *stob_domain_location, struct m0_be_log_cfg *log_cfg, bool create)
M0_INTERNAL void m0_semaphore_down(struct m0_semaphore *semaphore)
const struct m0_conf_obj_type M0_CONF_PROCESS_TYPE
static void be_ut_seg_allocator_initfini(struct m0_be_seg *seg, struct m0_be_ut_backend *ut_be, bool init)
void m0_be_ut_backend_cfg_default(struct m0_be_domain_cfg *cfg)
M0_INTERNAL void m0_semaphore_up(struct m0_semaphore *semaphore)
M0_INTERNAL void m0_be_allocator_credit(struct m0_be_allocator *a, enum m0_be_allocator_op optype, m0_bcount_t size, unsigned shift, struct m0_be_tx_credit *accum)
M0_BOB_DEFINE(M0_INTERNAL, &m0_ut_be_backend_bobtype, m0_be_ut_backend)
M0_INTERNAL void m0_sm_asts_run(struct m0_sm_group *grp)
M0_INTERNAL int m0_be_domain_seg_destroy(struct m0_be_domain *dom, struct m0_be_tx *tx, struct m0_be_seg *seg)
struct m0_be_engine_cfg bc_engine
static int m0_be_ut_sm_group_thread_init(struct m0_be_ut_sm_group_thread **sgtp, bool lock_new)
#define offsetof(typ, memb)
static uint64_t m0_align(uint64_t val, uint64_t alignment)
M0_INTERNAL void m0_module_fini(struct m0_module *module, int level)
static void be_ut_sm_group_thread_add(struct m0_be_ut_backend *ut_be, struct m0_be_ut_sm_group_thread *sgt)
void m0_be_ut_backend_init(struct m0_be_ut_backend *ut_be)
static int64_t m0_atomic64_add_return(struct m0_atomic64 *a, int64_t d)
M0_INTERNAL void m0_be_ut_backend_seg_add(struct m0_be_ut_backend *ut_be, const struct m0_be_0type_seg_cfg *seg_cfg, struct m0_be_seg **out)
M0_INTERNAL void m0_be_allocator_fini(struct m0_be_allocator *a)
static struct be_ut_helper_struct be_ut_helper
M0_INTERNAL void m0_be_tx_close_sync(struct m0_be_tx *tx)
M0_INTERNAL int m0_module_init(struct m0_module *module, int level)