Motr  M0
domain.c
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2013-2020 Seagate Technology LLC and/or its Affiliates
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * For any questions about this software or licensing,
18  * please email opensource@seagate.com or cortx-questions@seagate.com.
19  *
20  */
21 
22 
23 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_BE
24 #include "lib/trace.h"
25 #include "lib/errno.h"
26 #include "lib/memory.h"
27 #include "lib/string.h" /* m0_streq */
28 #include "lib/locality.h" /* m0_locality0_get */
29 #include "module/instance.h" /* m0_get */
30 #include "be/domain.h"
31 #include "be/seg0.h"
32 #include "be/seg.h"
33 #include "be/seg_internal.h" /* m0_be_seg_hdr */
34 #include "stob/stob.h" /* m0_stob_find_by_key */
35 #include "stob/domain.h" /* m0_stob_domain_init */
36 
37 M0_TL_DESCR_DEFINE(zt, "m0_be_domain::bd_0types", M0_INTERNAL,
38  struct m0_be_0type, b0_linkage, b0_magic,
40 M0_TL_DEFINE(zt, M0_INTERNAL, struct m0_be_0type);
41 
42 M0_TL_DESCR_DEFINE(seg, "m0_be_domain::bd_segs", M0_INTERNAL,
43  struct m0_be_seg, bs_linkage, bs_magic,
45 M0_TL_DEFINE(seg, static, struct m0_be_seg);
46 
53 static void be_domain_lock(struct m0_be_domain *dom)
54 {
55  m0_mutex_lock(&dom->bd_lock);
56 }
57 
58 static void be_domain_unlock(struct m0_be_domain *dom)
59 {
60  m0_mutex_unlock(&dom->bd_lock);
61 }
62 
63 static int m0_be_segobj_opt_iterate(struct m0_be_seg *dict,
64  const struct m0_be_0type *objtype,
65  struct m0_buf *opt,
66  char **suffix,
67  bool begin)
68 {
69  struct m0_buf *buf;
70  int rc;
71 
72  rc = begin ?
73  m0_be_seg_dict_begin(dict, objtype->b0_name,
74  (const char **)suffix, (void**) &buf) :
75  m0_be_seg_dict_next(dict, objtype->b0_name, *suffix,
76  (const char**) suffix, (void**) &buf);
77 
78  if (rc == -ENOENT)
79  return 0;
80  else if (rc == 0) {
81  if (buf != NULL)
82  *opt = *buf;
83  return +1;
84  }
85 
86  return M0_RC(rc);
87 }
88 
89 M0_INTERNAL int m0_be_segobj_opt_next(struct m0_be_seg *dict,
90  const struct m0_be_0type *objtype,
91  struct m0_buf *opt,
92  char **suffix)
93 {
94  return m0_be_segobj_opt_iterate(dict, objtype, opt, suffix, false);
95 }
96 
97 M0_INTERNAL int m0_be_segobj_opt_begin(struct m0_be_seg *dict,
98  const struct m0_be_0type *objtype,
99  struct m0_buf *opt,
100  char **suffix)
101 {
102  return m0_be_segobj_opt_iterate(dict, objtype, opt, suffix, true);
103 }
104 
105 static const char *id_cut(const char *prefix, const char *key)
106 {
107  size_t len;
108  char *p;
109 
110  if (key == NULL)
111  return key;
112 
113  p = strstr(key, prefix);
114  len = strlen(prefix);
115 
116  return p == NULL || len >= strlen(key) ? NULL : p + len;
117 }
118 
119 static int _0types_visit(struct m0_be_domain *dom, bool init)
120 {
121  int rc = 0;
122  int left;
123  char *suffix = NULL;
124  const char *id;
125  struct m0_buf opt;
126  struct m0_be_seg *dict;
127  struct m0_be_0type *objtype;
128 
129  dict = m0_be_domain_seg0_get(dom);
130 
131  m0_tl_for(zt, &dom->bd_0types, objtype) {
132  for (left = m0_be_segobj_opt_begin(dict, objtype, &opt, &suffix);
133  left > 0 && rc == 0;
134  left = m0_be_segobj_opt_next(dict, objtype, &opt, &suffix)) {
135  id = id_cut(objtype->b0_name, suffix);
136  rc = init ? objtype->b0_init(dom, id, &opt) :
137  (objtype->b0_fini(dom, id, &opt), 0);
138 
139  }
140  } m0_tl_endfor;
141 
142  return M0_RC(rc);
143 }
144 
146  uint64_t stob_key,
147  const char *stob_create_cfg,
148  struct m0_stob **out,
149  bool create)
150 {
151  int rc;
152  struct m0_stob_id stob_id;
153 
154  m0_stob_id_make(0, stob_key, &dom->bd_stob_domain->sd_id, &stob_id);
155  rc = m0_stob_find(&stob_id, out);
156  if (rc == 0) {
158  m0_stob_locate(*out) : 0;
159  rc = rc ?: create && m0_stob_state_get(*out) == CSS_NOENT ?
160  m0_stob_create(*out, NULL, stob_create_cfg) : 0;
161  rc = rc ?: m0_stob_state_get(*out) == CSS_EXISTS ? 0 : -ENOENT;
162  if (rc != 0)
163  m0_stob_put(*out);
164  }
166  return M0_RC(rc);
167 }
168 
170  struct m0_be_tx *tx,
171  struct m0_be_seg *seg)
172 {
173  struct m0_be_tx_credit cred = {};
174  struct m0_be_tx tx_ = {};
175  struct m0_sm_group *grp = m0_locality0_get()->lo_grp;
176  bool use_local_tx = tx == NULL;
177  bool tx_is_open;
178  int rc;
179 
180  if (use_local_tx) {
181  tx = &tx_;
183  m0_be_tx_init(tx, 0, dom, grp, NULL, NULL, NULL, NULL);
185  0, 0, &cred);
187  m0_be_tx_prep(tx, &cred);
188  rc = m0_be_tx_open_sync(tx);
189  tx_is_open = rc == 0;
190  } else {
191  rc = 0;
192  tx_is_open = false;
193  }
195  dom->bd_cfg.bc_zone_pcnt,
196  ARRAY_SIZE(dom->bd_cfg.bc_zone_pcnt));
197  if (rc == 0)
199  if (use_local_tx) {
200  if (tx_is_open)
202  m0_be_tx_fini(tx);
204  }
205  return M0_RC(rc);
206 }
207 
212  struct m0_be_seg *seg,
213  bool destroy)
214 {
215  int rc;
216 
218  seg_tlink_del_fini(seg);
220 
224  rc = destroy ? m0_be_seg_destroy(seg) : 0;
226  return M0_RC(rc);
227 }
228 
230  struct m0_be_seg *seg,
231  uint64_t stob_key)
232 {
233  struct m0_stob *stob;
234  int rc;
235 
236  rc = be_domain_stob_open(dom, stob_key, NULL, &stob, false);
237  if (rc == 0) {
239  m0_stob_put(stob);
240  rc = m0_be_seg_open(seg);
241  if (rc == 0) {
243  seg);
245 
247  seg_tlink_init_at_tail(seg, &dom->bd_segs);
249  } else {
251  }
252  }
253  return M0_RC(rc);
254 }
255 
257  uint64_t seg_id)
258 {
259  struct m0_be_seg seg;
260 
261  return be_domain_seg_open(dom, &seg, seg_id) ?:
262  be_domain_seg_close(dom, &seg, true);
263 }
264 
266  struct m0_be_tx *tx,
267  struct m0_be_seg *seg,
268  const struct m0_be_0type_seg_cfg *seg_cfg)
269 {
270  struct m0_stob *stob;
271  int rc;
272  int rc1;
273 
275  seg_cfg->bsc_stob_create_cfg, &stob, true);
276  if (rc != 0)
277  goto out;
279  m0_stob_put(stob);
280  rc = m0_be_seg_create(seg, seg_cfg->bsc_size, seg_cfg->bsc_addr);
282  if (rc != 0)
283  goto out;
284  rc = be_domain_seg_open(dom, seg, seg_cfg->bsc_stob_key);
285  if (rc != 0) {
286  M0_LOG(M0_ERROR, "can't open segment after successful "
287  "creation. seg_cfg->bsc_stob_key = %" PRIu64 ", rc = %d",
288  seg_cfg->bsc_stob_key, rc);
289  goto seg_destroy;
290  }
291  if (rc == 0 && seg_cfg->bsc_preallocate)
293  if (rc == 0)
294  goto out;
295 
296 seg_destroy:
297  rc1 = be_domain_seg_destroy(dom, seg_cfg->bsc_stob_key);
298  if (rc1 != 0) {
299  M0_LOG(M0_ERROR, "can't destroy segment after successful "
300  "creation. seg_cfg->bsc_stob_key = %" PRIu64 ", rc = %d",
301  seg_cfg->bsc_stob_key, rc1);
302  }
303 out:
304  return M0_RC(rc);
305 }
306 
307 static int be_0type_seg_init(struct m0_be_domain *dom,
308  const char *suffix,
309  const struct m0_buf *data)
310 {
311  struct m0_be_0type_seg_cfg *cfg =
312  (struct m0_be_0type_seg_cfg *)data->b_addr;
313  struct m0_be_seg *seg;
314  int rc;
315 
316  M0_ENTRY("suffix='%s', stob_key=%"PRIu64, suffix, cfg->bsc_stob_key);
317 
318  /* seg0 is already initialized */
319  if (m0_streq(suffix, "0"))
320  return 0;
321 
322  M0_ALLOC_PTR(seg);
323  if (seg != NULL) {
325  if (rc != 0)
326  m0_free(seg);
327  }
328  rc = seg == NULL ? -ENOMEM : rc;
329  return M0_RC(rc);
330 }
331 
332 static void be_0type_seg_fini(struct m0_be_domain *dom,
333  const char *suffix,
334  const struct m0_buf *data)
335 {
336  struct m0_be_seg *seg;
337 
338  M0_ENTRY("dom: %p, suffix: %s", dom, suffix);
339 
340  if (m0_streq(suffix, "0")) /* seg0 is finied separately */
341  return;
342 
343  seg = m0_be_domain_seg_by_id(dom, m0_strtou64(suffix, NULL, 10));
344  M0_ASSERT(seg != NULL);
345  M0_LOG(M0_DEBUG, "seg: %p, suffix: %s", seg, suffix);
346 
347  be_domain_seg_close(dom, seg, false);
348  m0_free(seg);
349  M0_LEAVE();
350 }
351 
352 /*
353  * Current implementations assumes
354  * m0_be_seg::bs_id == m0_stob_key_get(seg->bs_stob)
355  */
356 static const struct m0_be_0type m0_be_0type_seg = {
357  .b0_name = "M0_BE:SEG",
358  .b0_init = be_0type_seg_init,
359  .b0_fini = be_0type_seg_fini,
360 };
361 
362 M0_INTERNAL void
363 be_domain_log_cleanup(const char *stob_domain_location,
364  struct m0_be_log_cfg *log_cfg, bool create)
365 {
366  const char *location_add = "-log";
367  char *location;
368  size_t size;
369  int rc;
370 
371  size = strlen(stob_domain_location);
372  size += strlen(location_add) + 1;
374  strncpy(location, stob_domain_location, size);
375  strncat(location, location_add, size);
376  M0_ASSERT(location[size - 1] == '\0');
377  if (create) {
380  m0_stob_type_id_by_name("linuxstob"),
381  0, log_cfg->lc_store_cfg.lsc_stob_domain_key);
382  }
384  log_cfg->lc_store_cfg.lsc_stob_domain_init_cfg = "directio=true";
385  if (create) {
388  /*
389  * copy-paste from M0_BE_DOMAIN_LEVEL_MKFS_STOB_DOMAIN_DESTROY.
390  */
391  if (M0_IN(rc, (-ENOENT, 0))) {
392  M0_LOG(M0_DEBUG, "rc = %d", rc);
393  } else {
394  M0_LOG(M0_WARN, "rc = %d", rc);
395  }
396  }
397 }
398 
400  const struct m0_be_0type_seg_cfg *seg0_cfg)
401 {
402  struct m0_be_tx_credit cred = {};
403  const struct m0_buf seg0_cfg_buf = M0_BUF_INIT_PTR_CONST(seg0_cfg);
404  struct m0_sm_group *grp = m0_locality0_get()->lo_grp;
405  struct m0_be_tx tx = {};
406  int rc;
407 
408  M0_ENTRY();
409 
411  m0_be_tx_init(&tx, 0, dom, grp, NULL, NULL, NULL, NULL);
412  m0_be_0type_add_credit(dom, &dom->bd_0type_seg, "0",
413  &seg0_cfg_buf, &cred);
414  m0_be_tx_prep(&tx, &cred);
416  if (rc == 0) {
417  rc = m0_be_0type_add(&dom->bd_0type_seg, dom, &tx, "0",
418  &seg0_cfg_buf);
419  m0_be_tx_close_sync(&tx);
420  }
421  m0_be_tx_fini(&tx);
423  return M0_RC(rc);
424 }
425 
426 static void be_domain_ldsc_sync(struct m0_be_log_discard *ld,
427  struct m0_be_op *op,
428  struct m0_be_log_discard_item *ldi)
429 {
430  struct m0_be_domain *dom;
431  struct m0_be_seg *seg;
432  struct m0_stob *stobs[2];
433 
434  dom = container_of(ld, struct m0_be_domain, bd_log_discard);
435  stobs[0] = m0_be_domain_seg0_get(dom)->bs_stob;
437  stobs[1] = seg != NULL ? seg->bs_stob : NULL;
438  m0_be_pd_sync(&dom->bd_pd, 0, stobs, seg == NULL ? 1 : 2, op);
439 }
440 
441 M0_INTERNAL void
442 m0_be_domain_cleanup_by_location(const char *stob_domain_location)
443 {
444  struct m0_be_log_cfg log_cfg = {};
445 
446  /*
447  * It is safe to pass fake log_cfg into be_domain_log_cleanup().
448  * Location string is constructed inside the function. Other
449  * fields are accessed locally and not actually used.
450  */
451 
452  be_domain_log_cleanup(stob_domain_location, &log_cfg, true);
453 }
454 
455 M0_INTERNAL struct m0_be_tx *m0_be_domain_tx_find(struct m0_be_domain *dom,
456  uint64_t id)
457 {
459 }
460 
461 M0_INTERNAL struct m0_be_engine *m0_be_domain_engine(struct m0_be_domain *dom)
462 {
463  return &dom->bd_engine;
464 }
465 
466 M0_INTERNAL struct m0_be_seg *m0_be_domain_seg0_get(struct m0_be_domain *dom)
467 {
468  return &dom->bd_seg0;
469 }
470 
471 M0_INTERNAL struct m0_be_log *m0_be_domain_log(struct m0_be_domain *dom)
472 {
473  return &m0_be_domain_engine(dom)->eng_log;
474 }
475 
476 M0_INTERNAL struct m0_be_seg *m0_be_domain_seg(const struct m0_be_domain *dom,
477  const void *addr)
478 {
479  return m0_be_seg_contains(&dom->bd_seg0, addr) ?
480  (struct m0_be_seg *) &dom->bd_seg0 :
481  m0_tl_find(seg, seg, &dom->bd_segs,
483 }
484 
485 M0_INTERNAL struct m0_be_seg *
487 {
488  return m0_tl_find(seg, seg, &dom->bd_segs,
489  dom->bd_seg0.bs_id != seg->bs_id && seg->bs_id != 0);
490 }
491 
492 M0_INTERNAL struct m0_be_seg *
493 m0_be_domain_seg_by_id(const struct m0_be_domain *dom, uint64_t id)
494 {
495  return dom->bd_seg0.bs_id == id ? (struct m0_be_seg *) &dom->bd_seg0 :
496  m0_tl_find(seg, seg, &dom->bd_segs, seg->bs_id == id);
497 }
498 
499 static void be_domain_seg_suffix_make(const struct m0_be_domain *dom,
500  uint64_t seg_id,
501  char *str,
502  size_t str_size)
503 {
504  int nr = snprintf(str, str_size, "%"PRIu64, seg_id);
505 
506  M0_ASSERT(nr < str_size);
507 }
508 
509 M0_INTERNAL void
511  const struct m0_be_0type_seg_cfg *seg_cfg,
512  struct m0_be_tx_credit *cred)
513 {
514  struct m0_be_seg_hdr fake_seg_header;
515  struct m0_be_seg fake_seg = {
516  .bs_addr = &fake_seg_header,
517  .bs_size = 1,
518  };
519  char suffix[64];
520 
522  suffix, ARRAY_SIZE(suffix));
523  /* See next comment. The same applies to m0_be_allocator */
525  /*
526  * m0_be_btree credit interface was created a long time ago.
527  * It needs initalized segment allocator (at least as a parameter)
528  * to calculate credit. In m0_be_seg_dict m0_be_btree doesn't need to
529  * be allocated, so credit can be calculated without initialized
530  * allocator. First parameter should be changed to someting after proper
531  * interfaces introduced.
532  */
533  m0_be_seg_dict_create_credit(&fake_seg, cred); /* XXX */
534  m0_be_0type_add_credit(dom, &dom->bd_0type_seg, suffix,
535  &M0_BUF_INIT_PTR_CONST(seg_cfg), cred);
536  m0_be_0type_del_credit(dom, &dom->bd_0type_seg, suffix, cred);
537 }
538 
540  struct m0_be_seg *seg,
541  struct m0_be_tx_credit *cred)
542 {
543  char suffix[64];
544 
545  be_domain_seg_suffix_make(dom, seg->bs_id, suffix, ARRAY_SIZE(suffix));
546  m0_be_0type_del_credit(dom, &dom->bd_0type_seg, suffix, cred);
547 }
548 
549 M0_INTERNAL int
551  struct m0_be_tx *tx,
552  const struct m0_be_0type_seg_cfg *seg_cfg,
553  struct m0_be_seg **out)
554 {
555  struct m0_be_tx_credit cred = {};
556  struct m0_be_tx tx_ = {};
557  struct m0_sm_group *grp = m0_locality0_get()->lo_grp;
558  struct m0_be_seg *seg;
559  struct m0_be_seg seg1 = {};
560  bool use_local_tx = tx == NULL;
561  bool tx_is_open;
562  char suffix[64];
563  int rc;
564  int rc1;
565 
566  M0_PRE(ergo(tx != NULL, m0_be_tx__is_exclusive(tx)));
567  M0_ASSERT_INFO(!seg_tlist_is_empty(&dom->bd_segs),
568  "seg0 should be added first");
569 
571  suffix, ARRAY_SIZE(suffix));
572 
573  if (use_local_tx) {
574  tx = &tx_;
576  m0_be_tx_init(tx, 0, dom, grp, NULL, NULL, NULL, NULL);
577  m0_be_domain_seg_create_credit(dom, seg_cfg, &cred);
578  m0_be_tx_prep(tx, &cred);
580  tx_is_open = rc == 0;
581  } else {
582  rc = 0;
583  tx_is_open = false;
584  }
585  rc = rc ?: be_domain_seg_create(dom, tx, &seg1, seg_cfg);
586  if (rc == 0) {
587  be_domain_seg_close(dom, &seg1, false);
588  rc = m0_be_0type_add(&dom->bd_0type_seg, dom, tx, suffix,
589  &M0_BUF_INIT_PTR_CONST(seg_cfg));
590  if (rc == 0) {
591  seg = m0_be_domain_seg(dom, seg_cfg->bsc_addr);
592  M0_ASSERT(seg != NULL);
594  if (rc != 0) {
595  rc1 = m0_be_0type_del(&dom->bd_0type_seg, dom,
596  tx, suffix);
597  M0_ASSERT_INFO(rc1 != 0, "rc1 = %d", rc1);
598  }
599  }
600  if (rc != 0) {
601  rc1 = be_domain_seg_destroy(dom, seg_cfg->bsc_stob_key);
602  M0_LOG(M0_ERROR, "can't destroy segment "
603  "just after creation. "
604  "seg_cfg->bsc_stob_key = %" PRIu64 ", rc = %d",
605  seg_cfg->bsc_stob_key, rc1);
606  }
607  }
608  if (use_local_tx) {
609  if (tx_is_open)
611  m0_be_tx_fini(tx);
613  }
614  if (out != NULL) {
615  *out = rc != 0 ? NULL :
616  m0_be_domain_seg(dom, seg_cfg->bsc_addr);
617  }
618  return M0_RC(rc);
619 }
620 
621 M0_INTERNAL int m0_be_domain_seg_destroy(struct m0_be_domain *dom,
622  struct m0_be_tx *tx,
623  struct m0_be_seg *seg)
624 {
625  uint64_t seg_id = seg->bs_id;
626  char suffix[64];
627  int rc;
628 
630 
631  be_domain_seg_suffix_make(dom, seg->bs_id, suffix, ARRAY_SIZE(suffix));
632  rc = m0_be_0type_del(&dom->bd_0type_seg, dom, tx, suffix);
633  rc = rc ?: be_domain_seg_destroy(dom, seg_id);
634  /*
635  * It may be a problem here if 0type record for the segment was removed
636  * but be_domain_seg_destroy() failed.
637  */
638  return M0_RC(rc);
639 }
640 
641 M0_INTERNAL bool m0_be_domain_is_locked(const struct m0_be_domain *dom)
642 {
643  /* XXX: return m0_mutex_is_locked(&dom->bd_engine.eng_lock); */
644  return true;
645 }
646 
648  struct m0_be_0type *type)
649 {
651  zt_tlink_init_at_tail(type, &dom->bd_0types);
653 }
654 
656  struct m0_be_0type *type)
657 {
659  zt_tlink_del_fini(type);
661 }
662 
663 static const struct m0_modlev levels_be_domain[];
664 
665 static int be_domain_level_enter(struct m0_module *module)
666 {
667  struct m0_be_domain *dom = M0_AMB(dom, module, bd_module);
668  struct m0_be_domain_cfg *cfg = &dom->bd_cfg;
669  int level = module->m_cur + 1;
670  const char *level_name;
671  int rc;
672  unsigned i;
673 
674  level_name = levels_be_domain[level].ml_name;
675  M0_ENTRY("dom=%p level=%d level_name=%s", dom, level, level_name);
676  switch (level) {
678  zt_tlist_init(&dom->bd_0types);
679  seg_tlist_init(&dom->bd_segs);
680  m0_mutex_init(&dom->bd_engine_lock);
681  m0_mutex_init(&dom->bd_lock);
682  return M0_RC(0);
684  M0_ASSERT(cfg->bc_0types_nr > 0 && cfg->bc_0types != NULL);
685  M0_ALLOC_ARR(dom->bd_0types_allocated, cfg->bc_0types_nr);
686  if (dom->bd_0types_allocated == NULL)
687  return M0_ERR(-ENOMEM);
688 
689  dom->bd_0type_seg = m0_be_0type_seg;
690  m0_be_0type_register(dom, &dom->bd_0type_seg);
691 
692  for (i = 0; i < cfg->bc_0types_nr; ++i) {
693  dom->bd_0types_allocated[i] = *cfg->bc_0types[i];
694  m0_be_0type_register(dom, &dom->bd_0types_allocated[i]);
695  }
696  return M0_RC(0);
698  if (!cfg->bc_mkfs_mode)
699  return M0_RC(0);
702  /*
703  * Silence -ENOENT error - it's a perfectly valid case for the
704  * first run if the stob domain hasn't been created yet.
705  */
706  return M0_IN(rc, (-ENOENT, 0)) ? M0_RC(0) : M0_ERR(rc);
708  if (!cfg->bc_mkfs_mode)
709  return M0_RC(0);
710  /*
711  * The stob domain is never destroyed in case of failure, even
712  * in mkfs mode: it helps with the debugging.
713  */
716  cfg->bc_stob_domain_key,
718  &dom->bd_stob_domain));
719 
721  if (cfg->bc_mkfs_mode)
722  return M0_RC(0);
725  &dom->bd_stob_domain));
729  cfg->bc_log.lc_lock = &dom->bd_engine_lock;
730  /*
731  * The next temporary solution is needed as long as BE log uses
732  * direct I/O and BE segments can't work with direct I/O.
733  * The direct I/O configuration is per stob domain, not
734  * individual stobs. So BE uses 2 stob domains: one with direct
735  * I/O enabled for the log, and another one without direct I/O
736  * for segments.
737  *
738  * TODO use a single stob domain for BE after paged is
739  * implemented.
740  */
741  /* temporary solution BEGIN */
743  &cfg->bc_log, cfg->bc_mkfs_mode);
744  /* temporary solution END */
745  return M0_RC(0);
747  if (!cfg->bc_mkfs_mode)
748  return M0_RC(0);
750  &cfg->bc_log));
752  if (cfg->bc_mkfs_mode)
753  return M0_RC(0);
755  &cfg->bc_log));
757  M0_ASSERT(equi(cfg->bc_seg_cfg == NULL, cfg->bc_seg_nr == 0));
759  cfg->bc_engine.bec_group_nr,
760  "seg_io_nr must be at least number of tx_groups");
764  &cfg->bc_engine.bec_group_cfg,
765  &cfg->bc_pd_cfg.bpdc_io_credit);
766  return M0_RC(m0_be_pd_init(&dom->bd_pd, &cfg->bc_pd_cfg));
768  if (cfg->bc_mkfs_mode)
769  return M0_RC(0);
771  cfg->bc_seg0_stob_key));
773  if (cfg->bc_mkfs_mode)
774  return M0_RC(0);
775  return M0_RC(_0types_visit(dom, true));
781  cfg->bc_engine.bec_group_nr;
782  return M0_RC(m0_be_log_discard_init(&dom->bd_log_discard,
783  &cfg->bc_log_discard_cfg));
785  cfg->bc_engine.bec_domain = dom;
786  cfg->bc_engine.bec_log_discard = &dom->bd_log_discard;
787  cfg->bc_engine.bec_pd = &dom->bd_pd;
788  cfg->bc_engine.bec_lock = &dom->bd_engine_lock;
789  return M0_RC(m0_be_engine_init(&dom->bd_engine, dom,
790  &cfg->bc_engine));
792  return M0_RC(m0_be_engine_start(&dom->bd_engine));
794  if (!cfg->bc_mkfs_mode)
795  return M0_RC(0);
796  /*
797  * seg0 can only be created after BE engine started because
798  * m0_be_allocator_create() and m0_be_seg_dict_create() need
799  * engine to process a transaction.
800  */
803  &cfg->bc_seg0_cfg));
805  if (!cfg->bc_mkfs_mode)
806  return M0_RC(0);
810  if (!cfg->bc_mkfs_mode)
811  return M0_RC(0);
812  return M0_RC(be_domain_mkfs_seg0(dom, &cfg->bc_seg0_cfg));
814  if (!cfg->bc_mkfs_mode)
815  return M0_RC(0);
816  rc = 0;
817  for (i = 0; i < cfg->bc_seg_nr; ++i) {
818  /*
819  * Currently there is one transaction per segment
820  * created. It may be changed in the future.
821  */
823  &cfg->bc_seg_cfg[i],
824  NULL);
825  if (rc != 0)
826  break;
827  }
828  return M0_RC(rc);
830  return M0_RC(0);
831  default:
832  M0_IMPOSSIBLE("Unexpected level: %d %s", level, level_name);
833  }
834 }
835 
836 static void be_domain_level_leave(struct m0_module *module)
837 {
838  struct m0_be_domain *dom = M0_AMB(dom, module, bd_module);
839  struct m0_be_0type *zt;
840  int level = module->m_cur;
841  const char *level_name = levels_be_domain[level].ml_name;
842  unsigned i;
843 
844  M0_ENTRY("dom=%p level=%d level_name=%s", dom, level, level_name);
845  switch (level) {
847  m0_tl_teardown(zt, &dom->bd_0types, zt);
848  m0_mutex_fini(&dom->bd_lock);
849  m0_mutex_fini(&dom->bd_engine_lock);
850  seg_tlist_fini(&dom->bd_segs);
851  zt_tlist_fini(&dom->bd_0types);
852  break;
854  for (i = 0; i < dom->bd_cfg.bc_0types_nr; ++i) {
856  &dom->bd_0types_allocated[i]);
857  }
858  m0_be_0type_unregister(dom, &dom->bd_0type_seg);
859 
860  m0_free0(&dom->bd_0types_allocated);
861  break;
863  break;
865  break;
867  m0_stob_domain_fini(dom->bd_stob_domain);
868  break;
870  m0_free(dom->bd_cfg.bc_log.lc_store_cfg.
871  lsc_stob_domain_location);
872  break;
874  break;
876  m0_be_log_close(&dom->bd_engine.eng_log);
877  break;
879  m0_be_pd_fini(&dom->bd_pd);
880  break;
882  /*
883  * XXX A bug in failure handling is here.
884  * If m0_be_domain_cfg::bc_mkfs_mode is set and a failure happens
885  * after M0_BE_DOMAIN_LEVEL_NORMAL_SEG0_OPEN but before
886  * M0_BE_DOMAIN_LEVEL_MKFS_SEG0_CREATE succeeds this
887  * finalisation code will be incorrect.
888  * Some time ago seg0 was required for log. Now it's not the
889  * case. The proper solution would be to init+start engine and
890  * only then init seg0 and visit 0types. TODO implement this.
891  */
893  break;
895  (void)_0types_visit(dom, false);
896  break;
898  break;
900  M0_BE_OP_SYNC(op, m0_be_log_discard_flush(&dom->bd_log_discard,
901  &op));
902  /*
903  * XXX m0_be_log_discard initialised before and finalised before
904  * BE engine. It's a bug and it should be fixed.
905  */
906  m0_be_log_discard_fini(&dom->bd_log_discard);
907  m0_be_engine_fini(&dom->bd_engine);
908  break;
910  m0_be_engine_stop(&dom->bd_engine);
911  break;
917  break;
918  default:
919  M0_IMPOSSIBLE("Unexpected level: %d %s", level, level_name);
920  }
921  M0_LEAVE();
922 }
923 
924 #define BE_DOMAIN_LEVEL(level) [level] = { \
925  .ml_name = #level, \
926  .ml_enter = be_domain_level_enter, \
927  .ml_leave = be_domain_level_leave, \
928  }
929 static const struct m0_modlev levels_be_domain[] = {
949 };
950 #undef BE_DOMAIN_LEVEL
951 
952 M0_INTERNAL void m0_be_domain_module_setup(struct m0_be_domain *dom,
953  const struct m0_be_domain_cfg *cfg)
954 {
955  m0_module_setup(&dom->bd_module, "m0_be_domain module",
957  m0_get());
958  dom->bd_cfg = *cfg;
959 }
960 
961 M0_INTERNAL void m0_be_domain_tx_size_max(struct m0_be_domain *dom,
962  struct m0_be_tx_credit *cred,
963  m0_bcount_t *payload_size)
964 {
965  m0_be_engine_tx_size_max(&dom->bd_engine, cred, payload_size);
966 }
967 
968 M0_INTERNAL void m0_be_domain__group_limits(struct m0_be_domain *dom,
969  uint32_t *group_nr,
970  uint32_t *tx_per_group)
971 {
972  m0_be_engine__group_limits(&dom->bd_engine, group_nr, tx_per_group);
973 }
974 
975 M0_INTERNAL bool m0_be_domain_is_stob_log(struct m0_be_domain *dom,
976  const struct m0_stob_id *stob_id)
977 {
978  bool it_is;
979 
981  it_is = m0_be_log_contains_stob(m0_be_domain_log(dom), stob_id);
983  return it_is;
984 }
985 
986 M0_INTERNAL bool m0_be_domain_is_stob_seg(struct m0_be_domain *dom,
987  const struct m0_stob_id *stob_id)
988 {
989  bool it_is;
990 
992  it_is = m0_tl_exists(seg, seg, &dom->bd_segs,
993  m0_be_seg_contains_stob(seg, stob_id));
995  return it_is;
996 }
997 
998 M0_INTERNAL struct m0_be_seg *
1000  void *addr)
1001 {
1002  struct m0_be_seg *seg;
1003 
1005  seg = m0_tl_find(seg, seg, &dom->bd_segs,
1008  return seg;
1009 }
1010 
1011 /*
1012  * Note: the implementation is not as efficient as it can be for now.
1013  * We'll make it more efficient after page daemon is introduced.
1014  */
1015 M0_INTERNAL bool m0_be_domain_seg_is_valid(struct m0_be_domain *dom,
1016  struct m0_be_seg *seg)
1017 {
1018  struct m0_be_seg *result;
1019 
1021  result = m0_tl_find(seg, s, &dom->bd_segs, seg == s);
1023  return result;
1024 }
1025 
1026 #undef M0_TRACE_SUBSYSTEM
1027 
1029 /*
1030  * Local variables:
1031  * c-indentation-style: "K&R"
1032  * c-basic-offset: 8
1033  * tab-width: 8
1034  * fill-column: 80
1035  * scroll-step: 1
1036  * End:
1037  */
1038 /*
1039  * vim: tabstop=8 shiftwidth=8 noexpandtab textwidth=80 nowrap
1040  */
M0_INTERNAL void m0_be_engine_fini(struct m0_be_engine *en)
Definition: engine.c:171
struct m0_be_domain * bec_domain
Definition: engine.h:88
uint64_t id
Definition: cob.h:2380
void * bs_addr
Definition: seg.h:71
static struct m0_addb2_philter p
Definition: consumer.c:40
static size_t nr
Definition: dump.c:1505
M0_INTERNAL void m0_be_domain_seg_create_credit(struct m0_be_domain *dom, const struct m0_be_0type_seg_cfg *seg_cfg, struct m0_be_tx_credit *cred)
Definition: domain.c:510
M0_INTERNAL int m0_be_seg_dict_begin(struct m0_be_seg *seg, const char *start_key, const char **this_key, void **this_rec)
Definition: seg_dict.c:236
#define M0_PRE(cond)
M0_INTERNAL void m0_be_tx_group_discard(struct m0_be_log_discard *ld, struct m0_be_log_discard_item *ldi)
Definition: tx_group.c:635
#define M0_ALLOC_ARR(arr, nr)
Definition: memory.h:84
m0_bcount_t bisc_pos_start
Definition: io_sched.h:44
M0_INTERNAL void m0_be_domain__0type_unregister(struct m0_be_domain *dom, struct m0_be_0type *type)
Definition: domain.c:655
M0_INTERNAL void m0_be_tx_group_seg_io_credit(struct m0_be_tx_group_cfg *gr_cfg, struct m0_be_io_credit *io_cred)
Definition: tx_group.c:642
#define M0_BUF_INIT_PTR_CONST(p)
Definition: buf.h:73
M0_INTERNAL void m0_mutex_unlock(struct m0_mutex *mutex)
Definition: mutex.c:66
M0_INTERNAL bool m0_be_domain_is_stob_log(struct m0_be_domain *dom, const struct m0_stob_id *stob_id)
Definition: domain.c:975
M0_INTERNAL int m0_be_pd_init(struct m0_be_pd *pd, struct m0_be_pd_cfg *pd_cfg)
Definition: pd.c:86
M0_INTERNAL struct m0_be_tx * m0_be_engine__tx_find(struct m0_be_engine *en, uint64_t id)
Definition: engine.c:887
M0_INTERNAL void m0_stob_domain__dom_id_make(struct m0_fid *dom_id, uint8_t type_id, uint64_t dom_container, uint64_t dom_key)
Definition: domain.c:327
void m0_be_0type_add_credit(struct m0_be_domain *dom, const struct m0_be_0type *zt, const char *suffix, const struct m0_buf *data, struct m0_be_tx_credit *credit)
Definition: seg0.c:139
int(* b0_init)(struct m0_be_domain *dom, const char *suffix, const struct m0_buf *data)
Definition: seg0.h:62
#define NULL
Definition: misc.h:38
const char * b0_name
Definition: seg0.h:44
M0_INTERNAL void m0_be_seg_fini(struct m0_be_seg *seg)
Definition: stubs.c:128
M0_INTERNAL void m0_be_seg_dict_init(struct m0_be_seg *seg)
Definition: seg_dict.c:160
M0_INTERNAL int m0_stob_locate(struct m0_stob *stob)
Definition: stob.c:128
struct m0_fid si_domain_fid
Definition: stob.h:103
char * lsc_stob_domain_location
Definition: log_store.h:144
#define ergo(a, b)
Definition: misc.h:293
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)
Definition: domain.c:550
M0_INTERNAL bool m0_be_domain_is_locked(const struct m0_be_domain *dom)
Definition: domain.c:641
uint64_t bs_id
Definition: seg.h:67
struct m0_be_0type_seg_cfg bc_seg0_cfg
Definition: domain.h:120
static struct m0_sm_group * grp
Definition: bytecount.c:38
#define M0_LOG(level,...)
Definition: trace.h:167
M0_LEAVE()
M0_INTERNAL int m0_be_seg_dict_next(struct m0_be_seg *seg, const char *prefix, const char *start_key, const char **this_key, void **this_rec)
Definition: seg_dict.c:245
enum m0_trace_level level
Definition: trace.c:111
M0_INTERNAL void m0_be_log_discard_flush(struct m0_be_log_discard *ld, struct m0_be_op *op)
Definition: log_discard.c:374
void m0_be_0type_del_credit(struct m0_be_domain *dom, const struct m0_be_0type *zt, const char *suffix, struct m0_be_tx_credit *credit)
Definition: seg0.c:156
void(* ldsc_sync)(struct m0_be_log_discard *ld, struct m0_be_op *op, struct m0_be_log_discard_item *ldi)
Definition: log_discard.h:81
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)
Definition: stubs.c:118
static void be_0type_seg_fini(struct m0_be_domain *dom, const char *suffix, const struct m0_buf *data)
Definition: domain.c:332
M0_INTERNAL void m0_be_tx_fini(struct m0_be_tx *tx)
Definition: stubs.c:163
static void create(void)
Definition: service_ut.c:546
M0_INTERNAL int m0_be_seg_create(struct m0_be_seg *seg, m0_bcount_t size, void *addr)
Definition: seg.c:224
M0_INTERNAL bool m0_be_seg_contains_stob(struct m0_be_seg *seg, const struct m0_stob_id *stob_id)
Definition: seg.c:484
static struct m0_uint128 prefix
Definition: extmap.c:45
#define M0_BE_OP_SYNC(op_obj, action)
Definition: op.h:190
M0_INTERNAL int m0_be_log_open(struct m0_be_log *log, struct m0_be_log_cfg *log_cfg)
Definition: log.c:281
#define BE_DOMAIN_LEVEL(level)
Definition: domain.c:924
struct m0_mutex * bec_lock
Definition: engine.h:94
M0_INTERNAL int m0_be_engine_start(struct m0_be_engine *en)
Definition: engine.c:792
struct m0_bufvec data
Definition: di.c:40
void m0_be_0type_unregister(struct m0_be_domain *dom, struct m0_be_0type *zt)
Definition: seg0.c:72
M0_TL_DESCR_DEFINE(zt, "m0_be_domain::bd_0types", M0_INTERNAL, struct m0_be_0type, b0_linkage, b0_magic, M0_BE_0TYPE_MAGIC, M0_BE_0TYPE_MAGIC)
M0_INTERNAL struct m0_be_seg * m0_be_domain_seg0_get(struct m0_be_domain *dom)
Definition: domain.c:466
M0_INTERNAL int m0_be_reg__write(struct m0_be_reg *reg)
Definition: seg.c:462
M0_INTERNAL m0_bindex_t m0_be_log_recovery_discarded(struct m0_be_log *log)
Definition: log.c:1228
M0_INTERNAL void m0_be_domain__0type_register(struct m0_be_domain *dom, struct m0_be_0type *type)
Definition: domain.c:647
static const struct m0_be_0type m0_be_0type_seg
Definition: domain.c:356
const char * ml_name
Definition: module.h:114
M0_INTERNAL void m0_be_tx_prep(struct m0_be_tx *tx, const struct m0_be_tx_credit *credit)
Definition: stubs.c:175
uint64_t m0_bcount_t
Definition: types.h:77
static int left
Definition: locality.c:280
M0_INTERNAL struct m0 * m0_get(void)
Definition: instance.c:41
uint32_t ldsc_items_pending_max
Definition: log_discard.h:93
M0_INTERNAL struct m0_be_seg * m0_be_domain_seg_by_addr(struct m0_be_domain *dom, void *addr)
Definition: domain.c:999
static int void * buf
Definition: dir.c:1019
M0_INTERNAL bool m0_be_domain_is_stob_seg(struct m0_be_domain *dom, const struct m0_stob_id *stob_id)
Definition: domain.c:986
#define container_of(ptr, type, member)
Definition: misc.h:33
M0_INTERNAL void m0_mutex_lock(struct m0_mutex *mutex)
Definition: mutex.c:49
Definition: sock.c:887
const char * location
Definition: storage.c:50
M0_INTERNAL int m0_be_log_discard_init(struct m0_be_log_discard *ld, struct m0_be_log_discard_cfg *ld_cfg)
Definition: log_discard.c:85
M0_INTERNAL void m0_be_seg_close(struct m0_be_seg *seg)
Definition: stubs.c:140
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)
Definition: domain.c:539
#define m0_tl_endfor
Definition: tlist.h:700
static const struct m0_modlev levels_be_domain[]
Definition: domain.c:663
struct m0_be_log eng_log
Definition: engine.h:106
uint64_t lsc_stob_domain_key
Definition: log_store.h:161
return M0_RC(rc)
op
Definition: libdemo.c:64
#define equi(a, b)
Definition: misc.h:297
#define M0_ENTRY(...)
Definition: trace.h:170
Definition: buf.h:37
M0_INTERNAL void m0_sm_group_unlock(struct m0_sm_group *grp)
Definition: sm.c:96
struct m0_be_pd * bec_pd
Definition: engine.h:90
static int be_domain_seg_destroy(struct m0_be_domain *dom, uint64_t seg_id)
Definition: domain.c:256
int i
Definition: dir.c:1033
M0_INTERNAL struct m0_be_engine * m0_be_domain_engine(struct m0_be_domain *dom)
Definition: domain.c:461
struct m0_be_log_store_cfg lc_store_cfg
Definition: log.h:250
m0_bcount_t bsc_size
Definition: domain.h:72
M0_INTERNAL int m0_stob_domain_create(const char *location, const char *str_cfg_init, uint64_t dom_key, const char *str_cfg_create, struct m0_stob_domain **out)
Definition: domain.c:217
#define PRIu64
Definition: types.h:58
static void be_domain_seg_suffix_make(const struct m0_be_domain *dom, uint64_t seg_id, char *str, size_t str_size)
Definition: domain.c:499
M0_INTERNAL void m0_be_engine_got_log_space_cb(struct m0_be_log *log)
Definition: engine.c:860
struct m0_mutex * lc_lock
Definition: log.h:256
return M0_ERR(-EOPNOTSUPP)
M0_INTERNAL void m0_be_log_close(struct m0_be_log *log)
Definition: log.c:287
static int key
Definition: locality.c:283
uint64_t bsc_stob_key
Definition: domain.h:70
#define M0_AMB(obj, ptr, field)
Definition: misc.h:320
#define m0_tl_teardown(name, head, obj)
Definition: tlist.h:708
const char * bsc_stob_create_cfg
Definition: domain.h:74
Definition: stob.h:163
static int be_domain_mkfs_seg0(struct m0_be_domain *dom, const struct m0_be_0type_seg_cfg *seg0_cfg)
Definition: domain.c:399
uint64_t bc_stob_domain_key
Definition: domain.h:116
static struct m0_stob * stob
Definition: storage.c:39
#define m0_free0(pptr)
Definition: memory.h:77
void m0_be_0type_register(struct m0_be_domain *dom, struct m0_be_0type *zt)
Definition: seg0.c:65
#define M0_ASSERT(cond)
static void be_domain_level_leave(struct m0_module *module)
Definition: domain.c:836
static void be_domain_lock(struct m0_be_domain *dom)
Definition: domain.c:53
struct m0_be_log_discard * bec_log_discard
Definition: engine.h:89
const char * lsc_stob_domain_init_cfg
Definition: log_store.h:148
static int be_domain_seg_close(struct m0_be_domain *dom, struct m0_be_seg *seg, bool destroy)
Definition: domain.c:211
M0_INTERNAL struct m0_be_allocator * m0_be_seg_allocator(struct m0_be_seg *seg)
Definition: stubs.c:113
uint64_t m0_strtou64(const char *str, char **endptr, int base)
Definition: kmisc.c:26
#define m0_streq(a, b)
Definition: string.h:34
M0_INTERNAL struct m0_be_seg * m0_be_domain_seg(const struct m0_be_domain *dom, const void *addr)
Definition: domain.c:476
static struct m0_stob_domain * dom
Definition: storage.c:38
M0_INTERNAL void m0_be_seg_dict_fini(struct m0_be_seg *seg)
Definition: seg_dict.c:170
M0_INTERNAL void m0_stob_id_make(uint64_t container, uint64_t key, const struct m0_fid *dom_id, struct m0_stob_id *stob_id)
Definition: stob.c:343
M0_INTERNAL void m0_module_setup(struct m0_module *module, const char *name, const struct m0_modlev *level, int level_nr, struct m0 *instance)
Definition: module.c:193
M0_INTERNAL int m0_be_tx_open_sync(struct m0_be_tx *tx)
Definition: stubs.c:199
M0_INTERNAL struct m0_be_log * m0_be_domain_log(struct m0_be_domain *dom)
Definition: domain.c:471
m0_be_log_got_space_cb_t lc_got_space_cb
Definition: log.h:253
struct m0_be_io_sched_cfg bpdc_sched
Definition: pd.h:58
void * m0_alloc(size_t size)
Definition: memory.c:126
M0_INTERNAL int m0_be_log_create(struct m0_be_log *log, struct m0_be_log_cfg *log_cfg)
Definition: log.c:292
M0_INTERNAL void m0_be_domain_cleanup_by_location(const char *stob_domain_location)
Definition: domain.c:442
M0_INTERNAL void m0_mutex_init(struct m0_mutex *mutex)
Definition: mutex.c:35
M0_INTERNAL uint8_t m0_stob_type_id_by_name(const char *name)
Definition: type.c:139
M0_INTERNAL int m0_be_tx_exclusive_open_sync(struct m0_be_tx *tx)
Definition: tx.c:594
#define M0_POST(cond)
Definition: xcode.h:73
M0_INTERNAL void m0_be_pd_sync(struct m0_be_pd *pd, m0_bindex_t pos, struct m0_stob **stobs, int nr, struct m0_be_op *op)
Definition: pd.c:216
M0_INTERNAL bool m0_be_tx__is_exclusive(const struct m0_be_tx *tx)
Definition: tx.c:649
struct m0_sm_group * lo_grp
Definition: locality.h:67
const char * bc_stob_domain_cfg_init
Definition: domain.h:92
Definition: seg.h:66
static int be_domain_seg_create(struct m0_be_domain *dom, struct m0_be_tx *tx, struct m0_be_seg *seg, const struct m0_be_0type_seg_cfg *seg_cfg)
Definition: domain.c:265
M0_INTERNAL bool m0_be_seg_contains(const struct m0_be_seg *seg, const void *addr)
Definition: stubs.c:144
M0_INTERNAL void m0_be_log_discard_fini(struct m0_be_log_discard *ld)
Definition: log_discard.c:135
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)
Definition: engine.c:937
static int be_domain_seg_open(struct m0_be_domain *dom, struct m0_be_seg *seg, uint64_t stob_key)
Definition: domain.c:229
M0_INTERNAL void m0_be_engine__group_limits(struct m0_be_engine *en, uint32_t *group_nr, uint32_t *tx_per_group)
Definition: engine.c:947
static void be_domain_ldsc_sync(struct m0_be_log_discard *ld, struct m0_be_op *op, struct m0_be_log_discard_item *ldi)
Definition: domain.c:426
void(* ldsc_discard)(struct m0_be_log_discard *ld, struct m0_be_log_discard_item *ldi)
Definition: log_discard.h:84
void(* b0_fini)(struct m0_be_domain *dom, const char *suffix, const struct m0_buf *data)
Definition: seg0.h:65
M0_INTERNAL void m0_stob_domain_fini(struct m0_stob_domain *dom)
Definition: domain.c:204
int m0_be_0type_add(struct m0_be_0type *zt, struct m0_be_domain *dom, struct m0_be_tx *tx, const char *suffix, const struct m0_buf *data)
Definition: seg0.c:79
M0_INTERNAL void m0_be_domain__group_limits(struct m0_be_domain *dom, uint32_t *group_nr, uint32_t *tx_per_group)
Definition: domain.c:968
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)
Definition: stubs.c:150
M0_INTERNAL int m0_stob_create(struct m0_stob *stob, struct m0_dtx *dtx, const char *str_cfg)
Definition: stob.c:154
M0_INTERNAL bool m0_be_domain_seg_is_valid(struct m0_be_domain *dom, struct m0_be_seg *seg)
Definition: domain.c:1015
struct m0_module bd_module
Definition: domain.h:134
int init(struct workload *w)
M0_INTERNAL int m0_stob_domain_destroy_location(const char *location)
Definition: domain.c:242
struct m0_fid sd_id
Definition: domain.h:96
struct m0_be_pd_cfg bc_pd_cfg
Definition: domain.h:129
static void be_domain_unlock(struct m0_be_domain *dom)
Definition: domain.c:58
const struct m0_be_0type ** bc_0types
Definition: domain.h:81
struct m0_be_log_discard_cfg bc_log_discard_cfg
Definition: domain.h:130
M0_INTERNAL enum m0_stob_state m0_stob_state_get(struct m0_stob *stob)
Definition: stob.c:265
Definition: stob.h:91
M0_TL_DEFINE(zt, M0_INTERNAL, struct m0_be_0type)
M0_INTERNAL void m0_be_pd_fini(struct m0_be_pd *pd)
Definition: pd.c:127
M0_INTERNAL void m0_be_engine_stop(struct m0_be_engine *en)
Definition: engine.c:847
M0_INTERNAL struct m0_locality * m0_locality0_get(void)
Definition: locality.c:169
M0_INTERNAL void m0_be_domain_module_setup(struct m0_be_domain *dom, const struct m0_be_domain_cfg *cfg)
Definition: domain.c:952
M0_INTERNAL int m0_stob_domain_init(const char *location, const char *str_cfg_init, struct m0_stob_domain **out)
Definition: domain.c:195
static const char * id_cut(const char *prefix, const char *key)
Definition: domain.c:105
M0_INTERNAL void m0_be_seg_dict_create_credit(struct m0_be_seg *seg, struct m0_be_tx_credit *accum)
Definition: seg_dict.c:144
int m0_be_0type_del(struct m0_be_0type *zt, struct m0_be_domain *dom, struct m0_be_tx *tx, const char *suffix)
Definition: seg0.c:112
static int be_domain_stob_open(struct m0_be_domain *dom, uint64_t stob_key, const char *stob_create_cfg, struct m0_stob **out, bool create)
Definition: domain.c:145
#define M0_ALLOC_PTR(ptr)
Definition: memory.h:86
size_t bec_group_nr
Definition: engine.h:61
static int m0_be_segobj_opt_iterate(struct m0_be_seg *dict, const struct m0_be_0type *objtype, struct m0_buf *opt, char **suffix, bool begin)
Definition: domain.c:63
struct m0_be_0type_seg_cfg * bc_seg_cfg
Definition: domain.h:126
M0_INTERNAL void m0_be_domain_tx_size_max(struct m0_be_domain *dom, struct m0_be_tx_credit *cred, m0_bcount_t *payload_size)
Definition: domain.c:961
void * bsc_addr
Definition: domain.h:73
int m_cur
Definition: module.h:160
uint64_t bc_seg0_stob_key
Definition: domain.h:97
const char * bc_stob_domain_location
Definition: domain.h:87
M0_INTERNAL int m0_be_seg_destroy(struct m0_be_seg *seg)
Definition: seg.c:243
m0_bcount_t size
Definition: di.c:39
M0_INTERNAL void m0_mutex_fini(struct m0_mutex *mutex)
Definition: mutex.c:42
struct m0_be_io_credit bpdc_io_credit
Definition: pd.h:61
m0_be_log_full_cb_t lc_full_cb
Definition: log.h:254
M0_INTERNAL int m0_be_seg_open(struct m0_be_seg *seg)
Definition: stubs.c:132
M0_INTERNAL void m0_sm_group_lock(struct m0_sm_group *grp)
Definition: sm.c:83
M0_INTERNAL int m0_be_engine_init(struct m0_be_engine *en, struct m0_be_domain *dom, struct m0_be_engine_cfg *en_cfg)
Definition: engine.c:103
struct m0_be_log_cfg bc_log
Definition: domain.h:118
M0_INTERNAL int m0_stob_find(const struct m0_stob_id *id, struct m0_stob **out)
Definition: stob.c:92
static struct m0_be_seg * seg
Definition: btree.c:40
struct m0_stob * bs_stob
Definition: seg.h:68
static int _0types_visit(struct m0_be_domain *dom, bool init)
Definition: domain.c:119
static int be_domain_level_enter(struct m0_module *module)
Definition: domain.c:665
#define M0_ASSERT_INFO(cond, fmt,...)
bool bsc_preallocate
Definition: domain.h:71
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)
Definition: alloc.c:821
struct m0_be_tx_group_cfg bec_group_cfg
Definition: engine.h:71
M0_INTERNAL void m0_be_engine_full_log_cb(struct m0_be_log *log)
Definition: engine.c:874
M0_INTERNAL struct m0_be_seg * m0_be_domain_seg_first(const struct m0_be_domain *dom)
Definition: domain.c:486
M0_INTERNAL void m0_be_seg_dict_create(struct m0_be_seg *seg, struct m0_be_tx *tx)
Definition: seg_dict.c:342
M0_INTERNAL int m0_be_allocator_init(struct m0_be_allocator *a, struct m0_be_seg *seg)
Definition: alloc.c:719
M0_INTERNAL void be_domain_log_cleanup(const char *stob_domain_location, struct m0_be_log_cfg *log_cfg, bool create)
Definition: domain.c:363
M0_INTERNAL int m0_be_segobj_opt_next(struct m0_be_seg *dict, const struct m0_be_0type *objtype, struct m0_buf *opt, char **suffix)
Definition: domain.c:89
Definition: log.h:261
#define out(...)
Definition: gen.c:41
const char * bc_stob_domain_cfg_create
Definition: domain.h:111
#define M0_BE_REG_SEG(seg)
Definition: seg.h:155
int type
Definition: dir.c:1031
M0_INTERNAL struct m0_be_seg * m0_be_domain_seg_by_id(const struct m0_be_domain *dom, uint64_t id)
Definition: domain.c:493
static int be_0type_seg_init(struct m0_be_domain *dom, const char *suffix, const struct m0_buf *data)
Definition: domain.c:307
uint32_t bpdc_seg_io_nr
Definition: pd.h:59
static int be_domain_seg_structs_create(struct m0_be_domain *dom, struct m0_be_tx *tx, struct m0_be_seg *seg)
Definition: domain.c:169
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)
Definition: alloc.c:900
Definition: op.h:74
M0_INTERNAL bool m0_be_log_contains_stob(struct m0_be_log *log, const struct m0_stob_id *stob_id)
Definition: log.c:1233
#define m0_tl_find(name, var, head,...)
Definition: tlist.h:757
bool bc_mkfs_mode
Definition: domain.h:98
#define m0_tl_for(name, head, obj)
Definition: tlist.h:695
M0_INTERNAL int m0_be_domain_seg_destroy(struct m0_be_domain *dom, struct m0_be_tx *tx, struct m0_be_seg *seg)
Definition: domain.c:621
void m0_free(void *data)
Definition: memory.c:146
static struct m0_addb2_source * s
Definition: consumer.c:39
M0_INTERNAL int m0_be_segobj_opt_begin(struct m0_be_seg *dict, const struct m0_be_0type *objtype, struct m0_buf *opt, char **suffix)
Definition: domain.c:97
struct m0_be_engine_cfg bc_engine
Definition: domain.h:79
unsigned bc_seg_nr
Definition: domain.h:128
int32_t rc
Definition: trigger_fop.h:47
#define ARRAY_SIZE(a)
Definition: misc.h:45
M0_INTERNAL struct m0_be_tx * m0_be_domain_tx_find(struct m0_be_domain *dom, uint64_t id)
Definition: domain.c:455
#define m0_tl_exists(name, var, head,...)
Definition: tlist.h:774
M0_INTERNAL void m0_stob_put(struct m0_stob *stob)
Definition: stob.c:291
unsigned bc_0types_nr
Definition: domain.h:82
struct m0_stob_id lsc_stob_id
Definition: log_store.h:135
Definition: trace.h:478
M0_INTERNAL void m0_be_allocator_fini(struct m0_be_allocator *a)
Definition: alloc.c:745
M0_INTERNAL void m0_be_tx_close_sync(struct m0_be_tx *tx)
Definition: stubs.c:205
Definition: tx.h:280
Definition: idx_mock.c:47
#define M0_IMPOSSIBLE(fmt,...)