Motr  M0
log_store.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 #include "be/log_store.h"
24 
25 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_BE
26 #include "lib/trace.h" /* M0_LOG */
27 #include "lib/errno.h" /* ENOMEM */
28 #include "lib/memory.h" /* m0_alloc */
29 #include "lib/misc.h" /* M0_SET0 */
30 
31 #include "be/fmt.h" /* m0_be_fmt_log_header */
32 #include "be/log.h" /* m0_be_log_io */
33 #include "be/op.h" /* m0_be_op */
34 #include "be/io.h" /* m0_be_io */
35 
36 #include "module/instance.h" /* m0_get */
37 
38 #include "stob/stob.h" /* m0_stob_find */
39 #include "stob/domain.h" /* m0_stob_domain_create */
40 
47 enum {
48  M0_BE_LOG_STORE_WRITE_SIZE_MAX = 4 * 1024 * 1024,
49 };
50 
52  struct m0_buf *buf,
54 {
55  unsigned shift = m0_be_log_store_bshift(ls);
56 
57  buf->b_nob = size;
58  size = m0_align(size, 1ULL << shift);
59  buf->b_addr = m0_alloc_aligned(size, shift);
60 
61  return buf->b_addr == NULL ? -ENOMEM : 0;
62 }
63 
65  struct m0_buf *buf)
66 {
67  unsigned shift = m0_be_log_store_bshift(ls);
68 
69  m0_free_aligned(buf->b_addr, m0_align(buf->b_nob, 1ULL << shift),
70  shift);
71 }
72 
74 {
75  return true;
76 }
77 
78 static int be_log_store_zero(struct m0_be_log_store *ls, m0_bcount_t ls_size)
79 {
80  m0_bindex_t pos;
82  uint32_t bshift;
83  void *zero;
84  int rc;
85 
86  bshift = m0_stob_block_shift(ls->ls_stob);
88  rc = zero == NULL ? -ENOMEM : 0;
89  for (pos = 0; rc == 0 && pos < ls_size;
91  size = min64(ls_size - pos, M0_BE_LOG_STORE_WRITE_SIZE_MAX);
92  rc = m0_be_io_single(ls->ls_stob, SIO_WRITE, zero, pos, size);
93  }
95 
96  return rc;
97 }
98 
99 static struct m0_be_log_store *
101 {
102  /* XXX bob_of */
103  return container_of(module, struct m0_be_log_store, ls_module);
104 }
105 
106 static bool
108  uint64_t alignment)
109 {
110  M0_LOG(M0_DEBUG, "log store header begin");
111  M0_LOG(M0_DEBUG, "size = %"PRIu64, header->fsh_size);
112  M0_LOG(M0_DEBUG, "rbuf_offset = %"PRIu64, header->fsh_rbuf_offset);
113  M0_LOG(M0_DEBUG, "rbuf_nr = %u", header->fsh_rbuf_nr);
114  M0_LOG(M0_DEBUG, "rbuf_size = %"PRIu64, header->fsh_rbuf_size);
115  M0_LOG(M0_DEBUG, "rbuf_size_aligned = %"PRIu64,
116  header->fsh_rbuf_size_aligned);
117  M0_LOG(M0_DEBUG, "cbuf_offset = %"PRIu64, header->fsh_cbuf_offset);
118  M0_LOG(M0_DEBUG, "cbuf_size = %"PRIu64, header->fsh_cbuf_size);
119  M0_LOG(M0_DEBUG, "log store header end");
120 
121  return header->fsh_size > 0 &&
122  header->fsh_rbuf_nr > 0 &&
123  header->fsh_cbuf_offset >=
124  header->fsh_rbuf_offset + header->fsh_rbuf_nr *
125  header->fsh_rbuf_size_aligned &&
126  header->fsh_cbuf_offset +
127  header->fsh_cbuf_size <= header->fsh_size &&
128  m0_is_aligned(header->fsh_rbuf_offset, alignment) &&
129  m0_is_aligned(header->fsh_rbuf_size_aligned, alignment) &&
130  m0_is_aligned(header->fsh_cbuf_offset, alignment);
131 }
132 
134  struct m0_buf *buf)
135 {
137  ls->ls_header.fsh_rbuf_size_aligned);
138 }
139 
141  struct m0_buf *buf)
142 {
144 }
145 
147  int i,
148  bool init)
149 {
150  struct m0_be_io_credit iocred;
151  uint32_t bshift;
152  int rc = 0;
153 
154  if (!init)
155  goto fini;
156 
157  rc = be_log_store_rbuf_alloc(ls, &ls->ls_rbuf_read_buf[i]);
158  if (rc != 0)
159  goto err;
160  rc = m0_be_log_io_init(&ls->ls_rbuf_write_lio[i]);
161  if (rc != 0)
162  goto buf_free;
163  rc = m0_be_log_io_init(&ls->ls_rbuf_read_lio[i]);
164  if (rc != 0)
165  goto iow_fini;
166  iocred = M0_BE_IO_CREDIT(1, ls->ls_header.fsh_rbuf_size_aligned, 1);
167  bshift = m0_be_log_store_bshift(ls);
168  rc = m0_be_log_io_allocate(&ls->ls_rbuf_write_lio[i], &iocred, bshift);
169  if (rc != 0)
170  goto ior_fini;
171  rc = m0_be_log_io_allocate(&ls->ls_rbuf_read_lio[i], &iocred, bshift);
172  if (rc != 0)
173  goto iow_dealloc;
174  m0_be_op_init(&ls->ls_rbuf_write_op[i]);
175  m0_be_op_init(&ls->ls_rbuf_read_op[i]);
176  return 0;
177 
178 fini:
179  m0_be_op_fini(&ls->ls_rbuf_read_op[i]);
180  m0_be_op_fini(&ls->ls_rbuf_write_op[i]);
181  m0_be_log_io_deallocate(&ls->ls_rbuf_read_lio[i]);
182 iow_dealloc:
183  m0_be_log_io_deallocate(&ls->ls_rbuf_write_lio[i]);
184 ior_fini:
185  m0_be_log_io_fini(&ls->ls_rbuf_read_lio[i]);
186 iow_fini:
187  m0_be_log_io_fini(&ls->ls_rbuf_write_lio[i]);
188 buf_free:
189  be_log_store_rbuf_free(ls, &ls->ls_rbuf_read_buf[i]);
190 err:
191  return rc;
192 }
193 
195  int nr)
196 {
197  int i;
198 
199  for (i = nr - 1; i >= 0; --i)
201 }
202 
204 {
205  be_log_store_rbuf_fini_nr(ls, ls->ls_header.fsh_rbuf_nr);
206  be_log_store_rbuf_free(ls, &ls->ls_rbuf_write_buf);
207 }
208 
210 {
211  int i;
212  int rc = 0;
213 
214  for (i = 0; i < ls->ls_header.fsh_rbuf_nr; ++i) {
216  if (rc != 0)
217  break;
218  }
219  rc = rc ?: be_log_store_rbuf_alloc(ls, &ls->ls_rbuf_write_buf);
220  if (rc != 0)
222  return rc;
223 }
224 
226 {
227  m0_free(ls->ls_rbuf_write_lio);
228  m0_free(ls->ls_rbuf_write_op);
229  m0_free(ls->ls_rbuf_read_lio);
230  m0_free(ls->ls_rbuf_read_op);
231  m0_free(ls->ls_rbuf_read_buf);
232 }
233 
234 static int be_log_store_level_enter(struct m0_module *module)
235 {
237  struct m0_buf *buf;
239  struct m0_be_log_store *ls = be_log_store_module2store(module);
240  int level = module->m_cur + 1;
241  struct m0_stob_id *stob_id = &ls->ls_cfg.lsc_stob_id;
243  m0_bcount_t header_size;
244  uint32_t shift;
245  uint64_t alignment;
246  int rc;
247 
248  switch (level) {
250  ls->ls_stob_destroyed = false;
251  ls->ls_offset_discarded = 0;
252  return 0;
254  if (ls->ls_create_mode) {
255  /* Destroy stob domain if exists. */
257  ls->ls_cfg.lsc_stob_domain_location,
258  ls->ls_cfg.lsc_stob_domain_init_cfg,
259  &ls->ls_stob_domain);
260  if (rc == 0)
261  rc = m0_stob_domain_destroy(ls->ls_stob_domain);
262  else if (rc == -ENOENT)
263  rc = 0;
264  return rc ?: m0_stob_domain_create(
265  ls->ls_cfg.lsc_stob_domain_location,
266  ls->ls_cfg.lsc_stob_domain_init_cfg,
267  ls->ls_cfg.lsc_stob_domain_key,
268  ls->ls_cfg.lsc_stob_domain_create_cfg,
269  &ls->ls_stob_domain);
270  }
271  return m0_stob_domain_init(ls->ls_cfg.lsc_stob_domain_location,
272  ls->ls_cfg.lsc_stob_domain_init_cfg,
273  &ls->ls_stob_domain);
275  /*
276  * As BE log is no longer in 0types, it's configuration
277  * contains only stob domain location and the stob fid.
278  * si_domain_fid is set here after the stob domain is
279  * initialised.
280  *
281  * m0_be_log_store may not need a separate domain after paged
282  * is implemented, see the explanation in
283  * be_domain_level_enter()::M0_BE_DOMAIN_LEVEL_LOG_CONFIGURE.
284  *
285  * XXX TODO remote this after paged is implemented.
286  */
287  /* temporary solution BEGIN */
288  stob_id->si_domain_fid =
289  *m0_stob_domain_id_get(ls->ls_stob_domain);
290  /* temporary solution END */
291  return m0_stob_find(stob_id, &ls->ls_stob);
293  if (m0_stob_state_get(ls->ls_stob) == CSS_UNKNOWN)
294  return m0_stob_locate(ls->ls_stob);
295  return 0;
297  if (ls->ls_create_mode) {
298  return m0_stob_create(ls->ls_stob, NULL,
299  ls->ls_cfg.lsc_stob_create_cfg);
300  }
301  return m0_stob_state_get(ls->ls_stob) == CSS_EXISTS ?
302  0 : M0_ERR(-ENOENT);
304  if (ls->ls_create_mode) {
305  M0_ASSERT(ergo(ls->ls_cfg.lsc_stob_create_cfg != NULL,
306  !ls->ls_cfg.lsc_stob_dont_zero));
307  return ls->ls_cfg.lsc_stob_dont_zero ? 0 :
308  be_log_store_zero(ls, ls->ls_cfg.lsc_size);
309  }
310  return 0;
312  return m0_be_fmt_log_store_header_init(&ls->ls_header,
313  NULL);
315  shift = m0_be_log_store_bshift(ls);
316  size = m0_be_fmt_log_store_header_size_max(NULL);
317  size = m0_align(size, 1ULL << shift);
319  &ls->ls_header_buf,
320  size);
322  if (!ls->ls_create_mode)
323  return 0;
324  shift = m0_be_log_store_bshift(ls);
325  alignment = 1ULL << shift;
326  size = m0_be_fmt_log_store_header_size_max(NULL);
327  header_size = m0_align(size, alignment);
328 
329  header = &ls->ls_header;
330  header->fsh_size = ls->ls_cfg.lsc_size;
331  header->fsh_rbuf_offset = header_size;
332  header->fsh_rbuf_nr = ls->ls_cfg.lsc_rbuf_nr;
333  header->fsh_rbuf_size = ls->ls_cfg.lsc_rbuf_size;
334  header->fsh_rbuf_size_aligned = m0_align(header->fsh_rbuf_size,
335  alignment);
336  header->fsh_cbuf_offset = header->fsh_rbuf_offset +
337  header->fsh_rbuf_nr *
338  header->fsh_rbuf_size_aligned;
339  header->fsh_cbuf_size = header->fsh_size -
340  header->fsh_cbuf_offset;
342  return 0;
344  if (!ls->ls_create_mode)
345  return 0;
346  return m0_be_fmt_log_store_header_encode_buf(
347  &ls->ls_header, &ls->ls_header_buf);
349  buf = &ls->ls_header_buf;
350  opcode = ls->ls_create_mode ? SIO_WRITE : SIO_READ;
351  return m0_be_io_single(ls->ls_stob, opcode,
352  buf->b_addr, 0, buf->b_nob);
354  if (ls->ls_create_mode)
355  return 0;
356  rc = m0_be_fmt_log_store_header_decode_buf(&header,
357  &ls->ls_header_buf,
359  if (rc == 0) {
360  ls->ls_header = *header;
361  m0_be_fmt_log_store_header_decoded_free(header);
362 
363  shift = m0_be_log_store_bshift(ls);
364  alignment = 1ULL << shift;
365  header = &ls->ls_header;
366  if (!be_log_store_header_validate(header, alignment))
367  rc = M0_ERR(-EINVAL);
368  }
369  return rc;
371  M0_ALLOC_ARR(ls->ls_rbuf_write_lio, ls->ls_header.fsh_rbuf_nr);
372  M0_ALLOC_ARR(ls->ls_rbuf_write_op, ls->ls_header.fsh_rbuf_nr);
373  M0_ALLOC_ARR(ls->ls_rbuf_read_lio, ls->ls_header.fsh_rbuf_nr);
374  M0_ALLOC_ARR(ls->ls_rbuf_read_op, ls->ls_header.fsh_rbuf_nr);
375  M0_ALLOC_ARR(ls->ls_rbuf_read_buf, ls->ls_header.fsh_rbuf_nr);
376  if (ls->ls_rbuf_write_lio == NULL ||
377  ls->ls_rbuf_write_op == NULL ||
378  ls->ls_rbuf_read_lio == NULL ||
379  ls->ls_rbuf_read_op == NULL ||
380  ls->ls_rbuf_read_buf == NULL) {
382  return M0_ERR(-ENOMEM);
383  }
384  return 0;
386  return be_log_store_rbuf_init(ls);
390  return 0;
391  default:
392  return M0_ERR(-ENOSYS);
393  }
394 }
395 
396 static void be_log_store_level_leave(struct m0_module *module)
397 {
398  struct m0_be_log_store *ls = be_log_store_module2store(module);
399  int level = module->m_cur;
400  int rc;
401 
402  switch (level) {
404  break;
406  if (ls->ls_destroy_mode) {
407  rc = m0_stob_domain_destroy(ls->ls_stob_domain);
408  M0_ASSERT_INFO(rc == 0, "rc = %d", rc); /* XXX */
409  } else {
410  m0_stob_domain_fini(ls->ls_stob_domain);
411  }
412  break;
414  if (!ls->ls_stob_destroyed)
415  m0_stob_put(ls->ls_stob);
416  break;
418  break;
420  if (ls->ls_destroy_mode) {
421  rc = m0_stob_destroy(ls->ls_stob, NULL);
422  M0_ASSERT_INFO(rc == 0, "rc = %d", rc); /* XXX */
423  ls->ls_stob_destroyed = true;
424  }
425  break;
427  break;
429  m0_be_fmt_log_store_header_fini(&ls->ls_header);
430  break;
432  be_log_store_buf_free_aligned(ls, &ls->ls_header_buf);
433  break;
438  break;
441  break;
444  break;
446  break;
447  default:
448  M0_IMPOSSIBLE("Unexpected m0_module level");
449  }
450 }
451 
452 static const struct m0_modlev be_log_store_levels[] = {
454  .ml_name = "M0_BE_LOG_STORE_LEVEL_ASSIGNS",
455  .ml_enter = be_log_store_level_enter,
456  .ml_leave = be_log_store_level_leave,
457  },
459  .ml_name = "M0_BE_LOG_STORE_LEVEL_STOB_DOMAIN",
460  .ml_enter = be_log_store_level_enter,
461  .ml_leave = be_log_store_level_leave,
462  },
464  .ml_name = "M0_BE_LOG_STORE_LEVEL_STOB_FIND",
465  .ml_enter = be_log_store_level_enter,
466  .ml_leave = be_log_store_level_leave,
467  },
469  .ml_name = "M0_BE_LOG_STORE_LEVEL_STOB_LOCATE",
470  .ml_enter = be_log_store_level_enter,
471  .ml_leave = be_log_store_level_leave,
472  },
474  .ml_name = "M0_BE_LOG_STORE_LEVEL_STOB_CREATE",
475  .ml_enter = be_log_store_level_enter,
476  .ml_leave = be_log_store_level_leave,
477  },
479  .ml_name = "M0_BE_LOG_STORE_LEVEL_ZERO",
480  .ml_enter = be_log_store_level_enter,
481  .ml_leave = be_log_store_level_leave,
482  },
484  .ml_name = "M0_BE_LOG_STORE_LEVEL_LS_HEADER_INIT",
485  .ml_enter = be_log_store_level_enter,
486  .ml_leave = be_log_store_level_leave,
487  },
489  .ml_name = "M0_BE_LOG_STORE_LEVEL_LS_HEADER_BUF_ALLOC",
490  .ml_enter = be_log_store_level_enter,
491  .ml_leave = be_log_store_level_leave,
492  },
494  .ml_name = "M0_BE_LOG_STORE_LEVEL_HEADER_CREATE",
495  .ml_enter = be_log_store_level_enter,
496  .ml_leave = be_log_store_level_leave,
497  },
499  .ml_name = "M0_BE_LOG_STORE_LEVEL_HEADER_ENCODE",
500  .ml_enter = be_log_store_level_enter,
501  .ml_leave = be_log_store_level_leave,
502  },
504  .ml_name = "M0_BE_LOG_STORE_LEVEL_HEADER_IO",
505  .ml_enter = be_log_store_level_enter,
506  .ml_leave = be_log_store_level_leave,
507  },
509  .ml_name = "M0_BE_LOG_STORE_LEVEL_HEADER_DECODE",
510  .ml_enter = be_log_store_level_enter,
511  .ml_leave = be_log_store_level_leave,
512  },
514  .ml_name = "M0_BE_LOG_STORE_LEVEL_RBUF_ARR_ALLOC",
515  .ml_enter = be_log_store_level_enter,
516  .ml_leave = be_log_store_level_leave,
517  },
519  .ml_name = "M0_BE_LOG_STORE_LEVEL_RBUF_INIT",
520  .ml_enter = be_log_store_level_enter,
521  .ml_leave = be_log_store_level_leave,
522  },
524  .ml_name = "M0_BE_LOG_STORE_LEVEL_RBUF_ASSIGN",
525  .ml_enter = be_log_store_level_enter,
526  .ml_leave = be_log_store_level_leave,
527  },
529  .ml_name = "fully initialized",
530  },
531 };
532 
533 M0_INTERNAL void
535  struct m0_be_log_store_cfg *ls_cfg,
536  bool create_mode)
537 {
538  M0_ENTRY("lsc_stob_id="STOB_ID_F" lsc_size=%"PRIu64,
539  STOB_ID_P(&ls_cfg->lsc_stob_id), ls_cfg->lsc_size);
540 
541  ls->ls_cfg = *ls_cfg;
542  ls->ls_create_mode = create_mode;
543 
544  m0_module_setup(&ls->ls_module, "m0_be_log_store",
546  m0_get());
547 }
548 
550  bool destroy_mode)
551 {
552  ls->ls_destroy_mode = destroy_mode;
553  m0_module_fini(&ls->ls_module, M0_MODLEV_NONE);
554 }
555 
557  struct m0_be_log_store_cfg *ls_cfg,
558  bool create_mode)
559 {
560  int rc;
561 
562  m0_be_log_store_module_setup(ls, ls_cfg, create_mode);
564  if (rc != 0)
565  be_log_store_module_fini(ls, create_mode);
566  return rc;
567 }
568 
569 M0_INTERNAL int m0_be_log_store_open(struct m0_be_log_store *ls,
570  struct m0_be_log_store_cfg *ls_cfg)
571 {
572  return be_log_store_module_init(ls, ls_cfg, false);
573 }
574 
575 M0_INTERNAL int m0_be_log_store_create(struct m0_be_log_store *ls,
576  struct m0_be_log_store_cfg *ls_cfg)
577 {
578  return be_log_store_module_init(ls, ls_cfg, true);
579 }
580 
581 M0_INTERNAL void m0_be_log_store_destroy(struct m0_be_log_store *ls)
582 {
584 }
585 
586 M0_INTERNAL void m0_be_log_store_close(struct m0_be_log_store *ls)
587 {
589 }
590 
591 M0_INTERNAL uint32_t m0_be_log_store_bshift(struct m0_be_log_store *ls)
592 {
593  return m0_stob_block_shift(ls->ls_stob);
594 }
595 
597 {
598  return ls->ls_header.fsh_cbuf_size;
599 }
600 
602  struct m0_be_io_credit *accum)
603 {
604  m0_be_io_credit_add(accum, &M0_BE_IO_CREDIT(1, 0, 1));
605 }
606 
609  m0_bcount_t *length)
610 {
611  if (offset >= ls->ls_offset_discarded) {
612  *length = ls->ls_header.fsh_cbuf_size;
613  return 0;
614  } else {
615  return -EINVAL;
616  }
617 }
618 
621  struct m0_be_op *op)
622 {
624 
625  ls->ls_offset_discarded = max64u(offset, ls->ls_offset_discarded);
626 
627  m0_be_op_done(op);
628 }
629 
631  m0_bindex_t position)
632 {
633  return ls->ls_header.fsh_cbuf_offset +
634  position % ls->ls_header.fsh_cbuf_size;
635 }
636 
638  m0_bindex_t position,
639  struct m0_be_io *bio)
640 {
642  m0_bindex_t phys = be_log_store_phys_addr(ls, position);
643 
644  /* @note We support I/O to a single stob only. */
645  m0_be_io_stob_assign(bio, ls->ls_stob, 0, size);
646  m0_be_io_stob_move(bio, ls->ls_stob, phys,
647  ls->ls_header.fsh_cbuf_offset,
648  ls->ls_header.fsh_cbuf_size);
649  m0_be_io_vec_pack(bio);
650  m0_be_io_sort(bio);
651 }
652 
653 M0_INTERNAL struct m0_buf *
655 {
656  return &ls->ls_rbuf_write_buf;
657 }
658 
659 M0_INTERNAL struct m0_buf *
661  unsigned *iter)
662 {
663  *iter = 0;
664  return &ls->ls_rbuf_read_buf[*iter];
665 }
666 
667 M0_INTERNAL struct m0_buf *
669  unsigned *iter)
670 {
671  return ++*iter == ls->ls_header.fsh_rbuf_nr ?
672  NULL : &ls->ls_rbuf_read_buf[*iter];
673 }
674 
675 static struct m0_be_log_io *
677  enum m0_be_log_store_io_type io_type,
678  struct m0_be_op **op,
679  unsigned index)
680 {
681  M0_PRE(M0_IN(io_type, (M0_BE_LOG_STORE_IO_READ,
683  if (op != NULL) {
684  *op = &(io_type == M0_BE_LOG_STORE_IO_READ ?
685  ls->ls_rbuf_read_op : ls->ls_rbuf_write_op)[index];
686  }
687  return &(io_type == M0_BE_LOG_STORE_IO_READ ?
688  ls->ls_rbuf_read_lio : ls->ls_rbuf_write_lio)[index];
689 }
690 
691 M0_INTERNAL struct m0_be_log_io *
693  enum m0_be_log_store_io_type io_type,
694  struct m0_be_op **op,
695  unsigned *iter)
696 {
697  *iter = 0;
698  return be_log_store_rbuf_io_and_op(ls, io_type, op, *iter);
699 }
700 
701 M0_INTERNAL struct m0_be_log_io *
703  enum m0_be_log_store_io_type io_type,
704  struct m0_be_op **op,
705  unsigned *iter)
706 {
707  ++*iter;
708  if (*iter == ls->ls_header.fsh_rbuf_nr) {
709  if (op != NULL)
710  *op = NULL;
711  return NULL;
712  } else {
713  return be_log_store_rbuf_io_and_op(ls, io_type, op, *iter);
714  }
715 }
716 
717 M0_INTERNAL void
719  enum m0_be_log_store_io_type io_type)
720 {
722  struct m0_be_log_io *lio;
723  struct m0_be_io *bio;
724  struct m0_be_op *op;
725  struct m0_buf *buf;
728  int i;
729 
731  size = ls->ls_header.fsh_rbuf_size_aligned;
732  offset = ls->ls_header.fsh_rbuf_offset;
733  for (i = 0; i < ls->ls_header.fsh_rbuf_nr; ++i) {
734  if (io_type == M0_BE_LOG_STORE_IO_READ) {
735  lio = &ls->ls_rbuf_read_lio[i];
736  op = &ls->ls_rbuf_read_op[i];
737  buf = &ls->ls_rbuf_read_buf[i];
738  } else {
739  lio = &ls->ls_rbuf_write_lio[i];
740  op = &ls->ls_rbuf_write_op[i];
741  buf = &ls->ls_rbuf_write_buf;
742  }
743  m0_be_log_io_reset(lio);
744  bio = m0_be_log_io_be_io(lio);
745  m0_be_io_add(bio, ls->ls_stob, buf->b_addr,
746  offset + size * i, size);
749  }
750 }
751 
755  m0_bindex_t position)
756 {
757  m0_bindex_t end;
758 
761  position = be_log_store_phys_addr(ls, position);
762 
763  return (position >= index && position < end) ||
764  (index >= end && (position >= index || position < end));
765 }
766 
767 M0_INTERNAL bool
769  const struct m0_stob_id *stob_id)
770 {
771  return m0_stob_id_eq(stob_id, m0_stob_id_get(ls->ls_stob));
772 }
773 
775 #undef M0_TRACE_SUBSYSTEM
776 
777 
778 /*
779  * Local variables:
780  * c-indentation-style: "K&R"
781  * c-basic-offset: 8
782  * tab-width: 8
783  * fill-column: 80
784  * scroll-step: 1
785  * End:
786  */
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)
Definition: log_store.c:718
static size_t nr
Definition: dump.c:1505
#define M0_PRE(cond)
M0_INTERNAL void m0_be_log_store_io_discard(struct m0_be_log_store *ls, m0_bindex_t offset, struct m0_be_op *op)
Definition: log_store.c:619
#define M0_ALLOC_ARR(arr, nr)
Definition: memory.h:84
M0_INTERNAL m0_bcount_t m0_be_io_size(struct m0_be_io *bio)
Definition: io.c:500
#define M0_BE_FMT_DECODE_CFG_DEFAULT
Definition: fmt.h:291
M0_INTERNAL void m0_be_io_vec_pack(struct m0_be_io *bio)
Definition: io.c:470
M0_INTERNAL void m0_be_log_store_close(struct m0_be_log_store *ls)
Definition: log_store.c:586
#define NULL
Definition: misc.h:38
Definition: io.h:230
M0_INTERNAL int m0_stob_locate(struct m0_stob *stob)
Definition: stob.c:128
M0_INTERNAL int m0_be_log_store_open(struct m0_be_log_store *ls, struct m0_be_log_store_cfg *ls_cfg)
Definition: log_store.c:569
struct m0_fid si_domain_fid
Definition: stob.h:103
#define ergo(a, b)
Definition: misc.h:293
static int be_log_store_zero(struct m0_be_log_store *ls, m0_bcount_t ls_size)
Definition: log_store.c:78
static int be_log_store_level_enter(struct m0_module *module)
Definition: log_store.c:234
#define M0_LOG(level,...)
Definition: trace.h:167
enum m0_trace_level level
Definition: trace.c:111
M0_INTERNAL const struct m0_fid * m0_stob_domain_id_get(const struct m0_stob_domain *dom)
Definition: domain.c:300
static struct m0_be_log_io * be_log_store_rbuf_io_and_op(struct m0_be_log_store *ls, enum m0_be_log_store_io_type io_type, struct m0_be_op **op, unsigned index)
Definition: log_store.c:676
M0_INTERNAL int m0_stob_domain_destroy(struct m0_stob_domain *dom)
Definition: domain.c:227
M0_INTERNAL struct m0_buf * m0_be_log_store_rbuf_read_buf_first(struct m0_be_log_store *ls, unsigned *iter)
Definition: log_store.c:660
static void be_log_store_rbuf_fini_nr(struct m0_be_log_store *ls, int nr)
Definition: log_store.c:194
static int be_log_store_rbuf_init_fini_index(struct m0_be_log_store *ls, int i, bool init)
Definition: log_store.c:146
M0_INTERNAL struct m0_buf * m0_be_log_store_rbuf_read_buf_next(struct m0_be_log_store *ls, unsigned *iter)
Definition: log_store.c:668
const char * ml_name
Definition: module.h:114
M0_INTERNAL void m0_free_aligned(void *data, size_t size, unsigned shift)
Definition: memory.c:192
uint64_t m0_bindex_t
Definition: types.h:80
uint64_t m0_bcount_t
Definition: types.h:77
M0_INTERNAL struct m0 * m0_get(void)
Definition: instance.c:41
static int void * buf
Definition: dir.c:1019
#define container_of(ptr, type, member)
Definition: misc.h:33
M0_INTERNAL m0_bcount_t m0_be_log_store_buf_size(struct m0_be_log_store *ls)
Definition: log_store.c:596
Definition: sock.c:887
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)
Definition: log_store.c:692
op
Definition: libdemo.c:64
M0_INTERNAL uint32_t m0_stob_block_shift(struct m0_stob *stob)
Definition: stob.c:270
static void be_log_store_buf_free_aligned(struct m0_be_log_store *ls, struct m0_buf *buf)
Definition: log_store.c:64
#define M0_ENTRY(...)
Definition: trace.h:170
static const struct m0_uint128 zero
Definition: misc.c:41
Definition: buf.h:37
M0_INTERNAL struct m0_be_io * m0_be_log_io_be_io(struct m0_be_log_io *lio)
Definition: log_sched.c:164
M0_INTERNAL void m0_be_io_configure(struct m0_be_io *bio, enum m0_stob_io_opcode opcode)
Definition: io.c:516
M0_INTERNAL void m0_be_log_store_io_translate(struct m0_be_log_store *ls, m0_bindex_t position, struct m0_be_io *bio)
Definition: log_store.c:637
int opcode
Definition: crate.c:301
int i
Definition: dir.c:1033
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 struct m0_be_log_store * be_log_store_module2store(struct m0_module *module)
Definition: log_store.c:100
return M0_ERR(-EOPNOTSUPP)
M0_INTERNAL const struct m0_stob_id * m0_stob_id_get(struct m0_stob *stob)
Definition: stob.c:250
#define M0_ASSERT(cond)
m0_stob_io_opcode
Definition: io.h:227
static bool m0_is_aligned(uint64_t val, uint64_t alignment)
Definition: arith.h:179
#define STOB_ID_P(si)
Definition: stob.h:109
M0_INTERNAL int m0_be_io_single(struct m0_stob *stob, enum m0_stob_io_opcode opcode, void *ptr_user, m0_bindex_t offset_stob, m0_bcount_t size)
Definition: io.c:682
M0_INTERNAL void m0_be_io_credit_add(struct m0_be_io_credit *iocred0, const struct m0_be_io_credit *iocred1)
Definition: io.c:779
M0_INTERNAL void m0_be_log_io_deallocate(struct m0_be_log_io *lio)
Definition: log_sched.c:150
static bool be_log_store_header_validate(struct m0_be_fmt_log_store_header *header, uint64_t alignment)
Definition: log_store.c:107
M0_INTERNAL bool m0_be_log_store_contains_stob(struct m0_be_log_store *ls, const struct m0_stob_id *stob_id)
Definition: log_store.c:768
M0_INTERNAL void m0_be_io_stob_move(struct m0_be_io *bio, struct m0_stob *stob, m0_bindex_t offset, m0_bindex_t win_start, m0_bcount_t win_size)
Definition: io.c:416
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)
Definition: log_store.c:702
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 bool m0_be_log_store__invariant(struct m0_be_log_store *ls)
Definition: log_store.c:73
m0_bcount_t lsc_size
Definition: log_store.h:171
static void be_log_store_rbuf_free(struct m0_be_log_store *ls, struct m0_buf *buf)
Definition: log_store.c:140
M0_INTERNAL void m0_be_log_store_module_setup(struct m0_be_log_store *ls, struct m0_be_log_store_cfg *ls_cfg, bool create_mode)
Definition: log_store.c:534
struct m0_module ls_module
Definition: log_store.h:190
M0_INTERNAL void m0_be_op_done(struct m0_be_op *op)
Definition: stubs.c:104
static m0_bindex_t offset
Definition: dump.c:173
static m0_bindex_t be_log_store_phys_addr(struct m0_be_log_store *ls, m0_bindex_t position)
Definition: log_store.c:630
#define M0_BE_IO_CREDIT(reg_nr, reg_size, part_nr)
Definition: io.h:76
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)
Definition: log_store.c:752
M0_INTERNAL int m0_be_log_io_allocate(struct m0_be_log_io *lio, struct m0_be_io_credit *iocred, uint32_t log_bshift)
Definition: log_sched.c:114
M0_INTERNAL void m0_stob_domain_fini(struct m0_stob_domain *dom)
Definition: domain.c:204
static void be_log_store_rbuf_arr_free(struct m0_be_log_store *ls)
Definition: log_store.c:225
M0_INTERNAL int m0_stob_create(struct m0_stob *stob, struct m0_dtx *dtx, const char *str_cfg)
Definition: stob.c:154
int init(struct workload *w)
M0_INTERNAL void m0_be_op_reset(struct m0_be_op *op)
Definition: op.c:152
M0_INTERNAL int m0_be_log_io_init(struct m0_be_log_io *lio)
Definition: log_sched.c:97
M0_INTERNAL int m0_stob_destroy(struct m0_stob *stob, struct m0_dtx *dtx)
Definition: stob.c:200
M0_INTERNAL enum m0_stob_state m0_stob_state_get(struct m0_stob *stob)
Definition: stob.c:265
M0_INTERNAL void m0_be_op_active(struct m0_be_op *op)
Definition: stubs.c:100
M0_INTERNAL int m0_stob_domain_init(const char *location, const char *str_cfg_init, struct m0_stob_domain **out)
Definition: domain.c:195
M0_INTERNAL struct m0_buf * m0_be_log_store_rbuf_write_buf(struct m0_be_log_store *ls)
Definition: log_store.c:654
static int be_log_store_module_init(struct m0_be_log_store *ls, struct m0_be_log_store_cfg *ls_cfg, bool create_mode)
Definition: log_store.c:556
static void be_log_store_rbuf_fini(struct m0_be_log_store *ls)
Definition: log_store.c:203
static int64_t min64(int64_t a, int64_t b)
Definition: arith.h:46
static const struct m0_modlev be_log_store_levels[]
Definition: log_store.c:452
int m_cur
Definition: module.h:160
M0_INTERNAL int m0_be_log_store_create(struct m0_be_log_store *ls, struct m0_be_log_store_cfg *ls_cfg)
Definition: log_store.c:575
m0_bcount_t size
Definition: di.c:39
M0_INTERNAL void m0_be_op_fini(struct m0_be_op *op)
Definition: stubs.c:92
static void buf_free(struct m0_buf *bufs, uint32_t count)
Definition: xform.c:453
M0_INTERNAL bool m0_stob_id_eq(const struct m0_stob_id *stob_id0, const struct m0_stob_id *stob_id1)
Definition: stob.c:352
static int be_log_store_rbuf_init(struct m0_be_log_store *ls)
Definition: log_store.c:209
static void be_log_store_level_leave(struct m0_module *module)
Definition: log_store.c:396
int fini(struct workload *w)
M0_INTERNAL int m0_stob_find(const struct m0_stob_id *id, struct m0_stob **out)
Definition: stob.c:92
Definition: io.h:87
#define M0_ASSERT_INFO(cond, fmt,...)
#define STOB_ID_F
Definition: stob.h:108
static int be_log_store_rbuf_alloc(struct m0_be_log_store *ls, struct m0_buf *buf)
Definition: log_store.c:133
M0_INTERNAL void m0_be_log_store_io_credit(struct m0_be_log_store *ls, struct m0_be_io_credit *accum)
Definition: log_store.c:601
static bool ls
Definition: mt.c:44
M0_INTERNAL void * m0_alloc_aligned(size_t size, unsigned shift)
Definition: memory.c:168
Definition: io.h:229
M0_INTERNAL int m0_be_log_store_io_window(struct m0_be_log_store *ls, m0_bindex_t offset, m0_bcount_t *length)
Definition: log_store.c:607
M0_INTERNAL void m0_be_log_io_fini(struct m0_be_log_io *lio)
Definition: log_sched.c:102
Definition: op.h:74
m0_be_log_store_io_type
Definition: log_store.h:125
M0_INTERNAL void m0_be_op_init(struct m0_be_op *op)
Definition: stubs.c:87
void m0_free(void *data)
Definition: memory.c:146
M0_INTERNAL void m0_be_io_add(struct m0_be_io *bio, struct m0_stob *stob, void *ptr_user, m0_bindex_t offset_stob, m0_bcount_t size)
Definition: io.c:280
M0_INTERNAL void m0_be_io_stob_assign(struct m0_be_io *bio, struct m0_stob *stob, m0_bindex_t offset, m0_bcount_t size)
Definition: io.c:389
static int be_log_store_buf_alloc_aligned(struct m0_be_log_store *ls, struct m0_buf *buf, m0_bcount_t size)
Definition: log_store.c:51
int32_t rc
Definition: trigger_fop.h:47
#define ARRAY_SIZE(a)
Definition: misc.h:45
static uint64_t m0_align(uint64_t val, uint64_t alignment)
Definition: arith.h:170
M0_INTERNAL void m0_be_log_store_destroy(struct m0_be_log_store *ls)
Definition: log_store.c:581
M0_INTERNAL void m0_module_fini(struct m0_module *module, int level)
Definition: module.c:142
M0_INTERNAL void m0_stob_put(struct m0_stob *stob)
Definition: stob.c:291
M0_INTERNAL void m0_be_log_io_reset(struct m0_be_log_io *lio)
Definition: log_sched.c:106
static uint64_t max64u(uint64_t a, uint64_t b)
Definition: arith.h:71
struct m0_stob_id lsc_stob_id
Definition: log_store.h:135
M0_INTERNAL void m0_be_io_sort(struct m0_be_io *bio)
Definition: io.c:664
static void be_log_store_module_fini(struct m0_be_log_store *ls, bool destroy_mode)
Definition: log_store.c:549
M0_INTERNAL int m0_module_init(struct m0_module *module, int level)
Definition: module.c:131
#define M0_IMPOSSIBLE(fmt,...)
M0_INTERNAL uint32_t m0_be_log_store_bshift(struct m0_be_log_store *ls)
Definition: log_store.c:591