Motr  M0
tx_group.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 
26 #include "be/tx_group.h"
27 
28 #include "lib/misc.h" /* M0_SET0 */
29 #include "lib/errno.h" /* ENOSPC */
30 #include "lib/memory.h" /* M0_ALLOC_PTR */
31 
32 #include "be/tx_internal.h" /* m0_be_tx__reg_area */
33 #include "be/domain.h" /* m0_be_domain_seg */
34 #include "be/engine.h" /* m0_be_engine__tx_group_open */
35 #include "be/addb2.h" /* M0_AVI_BE_TX_TO_GROUP */
36 
45  struct m0_be_tx rtx_tx;
51  uint64_t rtx_magic;
52 };
53 
55 M0_TL_DESCR_DEFINE(rtxs, "m0_be_tx_group::tg_txs_recovering", static,
56  struct be_recovering_tx, rtx_link, rtx_magic,
58 M0_TL_DEFINE(rtxs, static, struct be_recovering_tx);
59 
60 M0_TL_DESCR_DEFINE(grp, "m0_be_tx_group::tg_txs", M0_INTERNAL,
61  struct m0_be_tx, t_group_linkage, t_magic,
63 M0_TL_DEFINE(grp, M0_INTERNAL, struct m0_be_tx);
64 
65 M0_INTERNAL void m0_be_tx_group_stable(struct m0_be_tx_group *gr)
66 {
67  M0_ENTRY();
69  M0_LEAVE();
70 }
71 
72 M0_INTERNAL struct m0_sm_group *
74 {
76 }
77 
78 M0_INTERNAL bool m0_be_tx_group_is_recovering(struct m0_be_tx_group *gr)
79 {
80  return gr->tg_recovering;
81 }
82 
84 {
85  struct m0_be_reg_area *ra;
86  struct m0_be_tx_credit used;
87  struct m0_be_tx_credit prepared;
88  struct m0_be_tx_credit captured;
89  struct m0_be_tx *tx;
90 
91  M0_LOG(M0_DEBUG, "gr=%p tx_nr=%zu", gr, m0_be_tx_group_tx_nr(gr));
92  /* XXX check if it's the right place */
93  if (m0_be_tx_group_tx_nr(gr) > 0) {
94  M0_BE_TX_GROUP_TX_FORALL(gr, tx) {
95  ra = m0_be_tx__reg_area(tx);
97 
98  m0_be_reg_area_prepared(ra, &prepared);
99  m0_be_reg_area_captured(ra, &captured);
101  M0_LOG(M0_DEBUG, "tx=%p t_prepared="BETXCR_F" "
102  "t_payload_prepared=%" PRId64 " "
103  "captured="BETXCR_F" "
104  "used="BETXCR_F" t_payload.b_nob=%"PRIu64,
105  tx, BETXCR_P(&prepared), tx->t_payload_prepared,
106  BETXCR_P(&captured), BETXCR_P(&used),
107  tx->t_payload.b_nob);
110  }
112 }
113 
115 {
116  /*
117  * In the future tx payload will be set via callbacks.
118  * This function will execute these callbacks to gather payload for
119  * each transaction from the group.
120  *
121  * Currently tx payload is filled before tx close, so this
122  * function does nothing.
123  */
124 }
125 
126 /*
127  * Fill m0_be_tx_group_format with data from the group.
128  */
130 {
131  struct m0_be_fmt_tx ftx;
132  struct m0_be_reg_d *rd;
133  struct m0_be_tx *tx;
134 
135  /* TODO add other fields */
136 
137  M0_BE_TX_GROUP_TX_FORALL(gr, tx) {
138  m0_be_tx_deconstruct(tx, &ftx);
139  m0_be_group_format_tx_add(&gr->tg_od, &ftx);
141 
144  };
145 }
146 
147 M0_INTERNAL void m0_be_tx_group_close(struct m0_be_tx_group *gr)
148 {
149  struct m0_be_tx *tx;
150  m0_bcount_t size_reserved = 0;
151  m0_bindex_t log_position;
152  m0_bindex_t log_discarded;
153 
154  M0_ENTRY("gr=%p recovering=%d", gr, (int)gr->tg_recovering);
155 
156  if (!gr->tg_recovering) {
160  M0_BE_TX_GROUP_TX_FORALL(gr, tx) {
161  size_reserved += tx->t_log_reserved_size;
163  m0_be_group_format_log_use(&gr->tg_od, size_reserved);
164  }
165  log_position = m0_be_group_format_log_position(&gr->tg_od);
166  log_discarded = m0_be_group_format_log_discarded(&gr->tg_od);
167  M0_ASSERT_INFO(log_position >= log_discarded,
168  "log_position=%" PRIu64 " log_discarded=%"PRIu64,
169  log_position, log_discarded);
170  M0_BE_TX_GROUP_TX_FORALL(gr, tx) {
171  m0_be_tx_lsn_set(tx, log_position, log_discarded);
174 
175  M0_LEAVE();
176 }
177 
178 M0_INTERNAL void m0_be_tx_group_reset(struct m0_be_tx_group *gr)
179 {
180  M0_PRE(grp_tlist_is_empty(&gr->tg_txs));
181  M0_PRE(rtxs_tlist_is_empty(&gr->tg_txs_recovering));
182  M0_PRE(gr->tg_nr_unclosed == 0);
183  M0_PRE(gr->tg_nr_unstable == 0);
184 
185  M0_SET0(&gr->tg_used);
186  M0_SET0(&gr->tg_log_reserved);
187  gr->tg_payload_prepared = 0;
188  gr->tg_recovering = false;
193 }
194 
195 M0_INTERNAL void m0_be_tx_group_prepare(struct m0_be_tx_group *gr,
196  struct m0_be_op *op)
197 {
199 }
200 
201 M0_INTERNAL int m0_be_tx_group_init(struct m0_be_tx_group *gr,
202  struct m0_be_tx_group_cfg *gr_cfg)
203 {
204  int rc;
205  int i;
206 
207  gr->tg_cfg = *gr_cfg;
209  .gfc_fmt_cfg = {
210  .fgc_tx_nr_max = gr_cfg->tgc_tx_nr_max,
211  .fgc_reg_nr_max = gr_cfg->tgc_size_max.tc_reg_nr,
212  .fgc_payload_size_max = gr_cfg->tgc_payload_max,
213  .fgc_reg_size_max = gr_cfg->tgc_size_max.tc_reg_size,
214  .fgc_seg_nr_max = gr_cfg->tgc_seg_nr_max,
215  },
216  .gfc_log = gr_cfg->tgc_log,
217  .gfc_log_discard = gr_cfg->tgc_log_discard,
218  .gfc_pd = gr_cfg->tgc_pd,
219  };
220  /* XXX temporary block begin */
221  gr->tg_size = gr_cfg->tgc_size_max;
222  gr->tg_payload_prepared = 0;
223  gr->tg_log = gr_cfg->tgc_log;
224  gr->tg_domain = gr_cfg->tgc_domain;
225  gr->tg_engine = gr_cfg->tgc_engine;
226  /* XXX temporary block end */
227  grp_tlist_init(&gr->tg_txs);
228  rtxs_tlist_init(&gr->tg_txs_recovering);
231  gr, gr->tg_log);
232  M0_ASSERT(rc == 0); /* XXX */
235  M0_ASSERT(rc == 0); /* XXX */
237  M0_ASSERT(rc == 0); /* XXX */
239  M0_ASSERT(gr->tg_rtxs != NULL); /* XXX */
240  for (i = 0; i < gr->tg_cfg.tgc_tx_nr_max; ++i) {
243  }
244  return 0;
245 }
246 
247 M0_INTERNAL bool m0_be_tx_group__invariant(struct m0_be_tx_group *gr)
248 {
249  return m0_be_tx_group_tx_nr(gr) <= gr->tg_cfg.tgc_tx_nr_max;
250 }
251 
252 M0_INTERNAL void m0_be_tx_group_fini(struct m0_be_tx_group *gr)
253 {
254  int i;
255 
256  for (i = 0; i < gr->tg_cfg.tgc_tx_nr_max; ++i) {
259  }
260  m0_free(gr->tg_rtxs);
264  rtxs_tlist_fini(&gr->tg_txs_recovering);
265  grp_tlist_fini(&gr->tg_txs);
266 }
267 
268 static void be_tx_group_tx_to_gr_map(const struct m0_be_tx *tx,
269  const struct m0_be_tx_group *gr)
270 {
271  uint64_t tid = m0_sm_id_get(&tx->t_sm);
272  uint64_t gid = m0_sm_id_get(&gr->tg_fom.tgf_gen.fo_sm_phase);
273 
275 }
276 
277 static void be_tx_group_tx_add(struct m0_be_tx_group *gr, struct m0_be_tx *tx)
278 {
279  M0_LOG(M0_DEBUG, "tx=%p group=%p", tx, gr);
280  grp_tlink_init_at_tail(tx, &gr->tg_txs);
283  be_tx_group_tx_to_gr_map(tx, gr);
284 }
285 
286 M0_INTERNAL int m0_be_tx_group_tx_add(struct m0_be_tx_group *gr,
287  struct m0_be_tx *tx)
288 {
289  struct m0_be_tx_credit group_used = gr->tg_used;
290  int rc;
291 
292  M0_ENTRY("gr=%p tx=%p t_prepared="BETXCR_F" t_payload_prepared=%"PRId64
293  " tg_used="BETXCR_F" tg_payload_prepared=%" PRId64 " "
294  "group_tx_nr=%zu",
295  gr, tx, BETXCR_P(&tx->t_prepared), tx->t_payload_prepared,
301 
302  if (m0_be_tx__is_recovering(tx)) {
303  be_tx_group_tx_add(gr, tx);
304  rc = 0; /* XXX check for ENOSPC */
305  } else {
306  m0_be_tx_credit_add(&group_used, &tx->t_prepared);
307 
308  if (m0_be_tx_group_tx_nr(gr) == gr->tg_cfg.tgc_tx_nr_max) {
309  rc = -EXFULL;
310  } else if (!m0_be_tx_credit_le(&group_used, &gr->tg_size) ||
312  gr->tg_cfg.tgc_payload_max) {
313  rc = -ENOSPC;
314  } else {
315  be_tx_group_tx_add(gr, tx);
316  gr->tg_used = group_used;
318  rc = 0;
319  }
320  }
322  return M0_RC(rc);
323 }
324 
325 M0_INTERNAL void m0_be_tx_group_tx_closed(struct m0_be_tx_group *gr,
326  struct m0_be_tx *tx)
327 {
328  struct m0_be_tx_credit tx_prepared;
329  struct m0_be_tx_credit tx_captured;
330  m0_bcount_t log_used;
331  m0_bcount_t log_unused;
332  uint64_t tx_sm_id;
333 
334  if (m0_be_tx__is_recovering(tx))
335  return;
336 
337  m0_be_reg_area_prepared(m0_be_tx__reg_area(tx), &tx_prepared);
338  m0_be_reg_area_captured(m0_be_tx__reg_area(tx), &tx_captured);
339  M0_ASSERT(m0_be_tx_credit_le(&tx_prepared, &gr->tg_used));
340  M0_ASSERT(m0_be_tx_credit_le(&tx_captured, &tx_prepared));
343  M0_LOG(M0_DEBUG, "gr=%p tx=%p tx_prepared="BETXCR_F" "
344  "t_payload_prepared=%" PRIu64 " tg_used="BETXCR_F" "
345  "tg_payload_prepared=%"PRIu64, gr, tx, BETXCR_P(&tx_prepared),
347  gr->tg_payload_prepared);
348 
349  m0_be_tx_credit_sub(&gr->tg_used, &tx_prepared);
350  m0_be_tx_credit_add(&gr->tg_used, &tx_captured);
353  M0_LOG(M0_DEBUG, "gr=%p tx=%p tx_captured="BETXCR_F" "
354  "t_payload.b_nob=%" PRIu64 " tg_used="BETXCR_F" "
355  "tg_payload_prepared=%"PRIu64, gr, tx, BETXCR_P(&tx_captured),
356  tx->t_payload.b_nob, BETXCR_P(&gr->tg_used),
357  gr->tg_payload_prepared);
358 
360  gr->tg_cfg.tgc_log, &tx_captured,
361  tx->t_payload.b_nob);
362  M0_ASSERT(tx->t_log_reserved_size >= log_used);
363 
364  tx_sm_id = m0_sm_id_get(&tx->t_sm);
366  tx->t_log_reserved_size);
368  log_used);
369 
370  log_unused = tx->t_log_reserved_size - log_used;
371  tx->t_log_reserved_size = log_used;
372  m0_be_log_unreserve(gr->tg_cfg.tgc_log, log_unused);
373 }
374 
375 M0_INTERNAL void m0_be_tx_group_tx_del(struct m0_be_tx_group *gr,
376  struct m0_be_tx *tx)
377 {
378  M0_LOG(M0_DEBUG, "tx=%p gr=%p", tx, gr);
379  grp_tlink_del_fini(tx);
380  be_tx_group_tx_to_gr_map(tx, gr);
381 }
382 
383 M0_INTERNAL size_t m0_be_tx_group_tx_nr(struct m0_be_tx_group *gr)
384 {
385  return grp_tlist_length(&gr->tg_txs);
386 }
387 
388 M0_INTERNAL void m0_be_tx_group_open(struct m0_be_tx_group *gr)
389 {
391 }
392 
393 M0_INTERNAL int m0_be_tx_group_start(struct m0_be_tx_group *gr)
394 {
395  return m0_be_tx_group_fom_start(&gr->tg_fom);
396 }
397 
398 M0_INTERNAL void m0_be_tx_group_stop(struct m0_be_tx_group *gr)
399 {
401 }
402 
403 M0_INTERNAL int m0_be_tx_group__allocate(struct m0_be_tx_group *gr)
404 {
405  return m0_be_group_format_allocate(&gr->tg_od);
406 }
407 
408 M0_INTERNAL void m0_be_tx_group__deallocate(struct m0_be_tx_group *gr)
409 {
411 }
412 
414 {
415  struct m0_be_reg_d *rd;
416 
417  if (!gr->tg_recovering) {
420  }
422 }
423 
424 M0_INTERNAL void m0_be_tx_group_seg_place(struct m0_be_tx_group *gr,
425  struct m0_be_op *op)
426 {
428 }
429 
430 M0_INTERNAL void m0_be_tx_group_encode(struct m0_be_tx_group *gr)
431 {
433 }
434 
435 M0_INTERNAL void m0_be_tx_group_log_write(struct m0_be_tx_group *gr,
436  struct m0_be_op *op)
437 {
439 }
440 
441 M0_INTERNAL void
443  enum m0_be_tx_state state,
444  bool del_tx_from_group)
445 {
446  struct m0_be_tx *tx;
447 
448  M0_ENTRY("gr=%p state=%s group_tx_nr=%zd",
449  gr, m0_be_tx_state_name(state), m0_be_tx_group_tx_nr(gr));
450 
452 
453  M0_BE_TX_GROUP_TX_FORALL(gr, tx) {
454  if (del_tx_from_group)
455  m0_be_tx_group_tx_del(gr, tx);
456  m0_be_tx__state_post(tx, state);
458 
459  M0_LEAVE();
460 }
461 
463  struct m0_be_log *log)
464 {
467  gr->tg_recovering = true;
468 }
469 
470 M0_INTERNAL void m0_be_tx_group_log_read(struct m0_be_tx_group *gr,
471  struct m0_be_op *op)
472 {
473  return m0_be_group_format_log_read(&gr->tg_od, op);
474 }
475 
476 M0_INTERNAL int m0_be_tx_group_decode(struct m0_be_tx_group *gr)
477 {
478  return m0_be_group_format_decode(&gr->tg_od);
479 }
480 
482 {
483  struct m0_be_group_format *gft = &gr->tg_od;
484  struct m0_be_seg *seg;
485  struct m0_be_reg_d rd;
486  uint32_t reg_nr;
487  uint32_t i;
488 
489  reg_nr = m0_be_group_format_reg_nr(gft);
490  for (i = 0; i < reg_nr; ++i) {
491  m0_be_group_format_reg_get(gft, i, &rd);
493  /*
494  * It is possible that seg is already removed from seg0.
495  * In this case the safest way is to ignore such regions.
496  * TODO add some code to prevent ABA problem (another segment
497  * is added at the same address as previous is removed).
498  */
499  if (seg != NULL) {
501  rd.rd_reg.br_seg = seg;
503  }
504  }
505 }
506 
507 static struct be_recovering_tx *
509 {
510  return container_of(tx, struct be_recovering_tx, rtx_tx);
511 }
512 
514 {
515  struct be_recovering_tx *rtx;
516 
518  if (m0_be_tx_state(&rtx->rtx_tx) == M0_BTS_ACTIVE) {
520  m0_be_op_done(&rtx->rtx_op_open);
521  }
522  return false;
523 }
524 
525 static void be_tx_group_recovering_gc(struct m0_be_tx *tx, void *param)
526 {
527  struct be_recovering_tx *rtx;
528 
529  rtx = tx2tx_group_recovering_tx(tx);
530  rtxs_tlink_del_fini(rtx);
532  m0_be_op_done(&rtx->rtx_op_gc);
533 }
534 
542  struct m0_sm_group *sm_grp)
543 {
544  struct be_recovering_tx *rtx;
545  struct m0_be_group_format *gft = &gr->tg_od;
546  struct m0_be_fmt_tx ftx;
547  struct m0_be_tx *tx;
548  uint32_t tx_nr;
549  uint32_t i;
550 
551  tx_nr = m0_be_group_format_tx_nr(gft);
552  for (i = 0; i < tx_nr; ++i) {
553  rtx = &gr->tg_rtxs[i];
554  /*
555  * rtx->rtx_op_open and rtx->rtx_op_gc are initialised in
556  * m0_be_tx_group_init().
557  */
558  M0_SET0(&rtx->rtx_tx);
559  M0_SET0(&rtx->rtx_open_wait);
560  rtxs_tlink_init_at_tail(rtx, &gr->tg_txs_recovering);
561  m0_be_group_format_tx_get(gft, i, &ftx);
562  tx = &rtx->rtx_tx;
563  m0_be_tx_init(tx, 0, gr->tg_domain,
564  sm_grp, NULL, NULL, NULL, NULL);
565  m0_be_tx__group_assign(tx, gr);
567  m0_be_tx_reconstruct(tx, &ftx);
569  m0_be_op_reset(&rtx->rtx_op_gc);
572  m0_clink_add(&tx->t_sm.sm_chan, &rtx->rtx_open_wait);
574  }
575 }
576 
577 M0_INTERNAL int m0_be_tx_group_reconstruct(struct m0_be_tx_group *gr,
578  struct m0_sm_group *sm_grp)
579 {
582  return 0; /* XXX no error handling yet. It will be fixed. */
583 }
584 
586  struct m0_be_op *op)
587 {
588  struct be_recovering_tx *rtx;
589 
590  m0_tl_for(rtxs, &gr->tg_txs_recovering, rtx) {
592  } m0_tl_endfor;
593 
594  m0_tl_for(rtxs, &gr->tg_txs_recovering, rtx) {
596  m0_be_tx_open(&rtx->rtx_tx);
597  } m0_tl_endfor;
598 }
599 
600 M0_INTERNAL void
602  struct m0_be_op *op_gc)
603 {
604  struct be_recovering_tx *rtx;
605 
606  m0_tl_for(rtxs, &gr->tg_txs_recovering, rtx) {
607  m0_be_op_set_add(op_gc, &rtx->rtx_op_gc);
608  } m0_tl_endfor;
609 
610  m0_tl_for(rtxs, &gr->tg_txs_recovering, rtx) {
611  m0_be_op_active(&rtx->rtx_op_gc);
612  m0_be_tx_close(&rtx->rtx_tx);
613  } m0_tl_endfor;
614 }
615 
616 /*
617  * It will perform actual I/O when paged implemented so op is added
618  * to the function parameters list.
619  */
620 M0_INTERNAL int m0_be_tx_group_reapply(struct m0_be_tx_group *gr,
621  struct m0_be_op *op)
622 {
623  struct m0_be_reg_d *rd;
624 
626 
628  memcpy(rd->rd_reg.br_addr, rd->rd_buf, rd->rd_reg.br_size);
629  };
630 
631  m0_be_op_done(op);
632  return 0;
633 }
634 
635 M0_INTERNAL void m0_be_tx_group_discard(struct m0_be_log_discard *ld,
636  struct m0_be_log_discard_item *ldi)
637 {
639 }
640 
641 M0_INTERNAL void
643  struct m0_be_io_credit *io_cred)
644 {
645  struct m0_be_group_format_cfg gft_cfg = {
646  .gfc_fmt_cfg = {
648  .fgc_reg_size_max = gr_cfg->tgc_size_max.tc_reg_size,
649  .fgc_seg_nr_max = gr_cfg->tgc_seg_nr_max,
650  }
651  };
652  m0_be_group_format_seg_io_credit(&gft_cfg, io_cred);
653 }
654 
656 #undef M0_TRACE_SUBSYSTEM
657 
658 /*
659  * Local variables:
660  * c-indentation-style: "K&R"
661  * c-basic-offset: 8
662  * tab-width: 8
663  * fill-column: 80
664  * scroll-step: 1
665  * End:
666  */
667 /*
668  * vim: tabstop=8 shiftwidth=8 noexpandtab textwidth=80 nowrap
669  */
m0_bcount_t tgc_payload_max
Definition: tx_group.h:66
struct m0_be_tx_credit t_prepared
Definition: tx.h:300
struct m0_be_reg_area tg_reg_area
Definition: tx_group.h:135
M0_INTERNAL void m0_be_tx_group_seg_place(struct m0_be_tx_group *gr, struct m0_be_op *op)
Definition: tx_group.c:424
M0_INTERNAL int m0_be_tx_group_fom_start(struct m0_be_tx_group_fom *gf)
Definition: tx_group_fom.c:381
struct m0_tlink rtx_link
Definition: tx_group.c:50
#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
struct be_recovering_tx * tg_rtxs
Definition: tx_group.h:124
M0_INTERNAL void m0_be_group_format_prepare(struct m0_be_group_format *gft, struct m0_be_op *op)
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
M0_INTERNAL void m0_be_tx_group_close(struct m0_be_tx_group *gr)
Definition: tx_group.c:147
static void be_tx_group_recovering_gc(struct m0_be_tx *tx, void *param)
Definition: tx_group.c:525
struct m0_be_group_format tg_od
Definition: tx_group.h:130
M0_INTERNAL void m0_be_group_format_log_read(struct m0_be_group_format *gft, struct m0_be_op *op)
#define BETXCR_F
Definition: tx_credit.h:102
struct m0_tl tg_txs_recovering
Definition: tx_group.h:122
M0_INTERNAL int m0_be_tx_group_init(struct m0_be_tx_group *gr, struct m0_be_tx_group_cfg *gr_cfg)
Definition: tx_group.c:201
M0_INTERNAL void m0_be_tx_lsn_set(struct m0_be_tx *tx, m0_bindex_t lsn, m0_bindex_t lsn_discarded)
Definition: tx.c:743
M0_INTERNAL void m0_be_group_format_seg_io_credit(struct m0_be_group_format_cfg *gft_cfg, struct m0_be_io_credit *io_cred)
M0_INTERNAL void m0_be_tx_group_recovery_prepare(struct m0_be_tx_group *gr, struct m0_be_log *log)
Definition: tx_group.c:462
#define NULL
Definition: misc.h:38
M0_INTERNAL m0_bindex_t m0_be_group_format_log_discarded(const struct m0_be_group_format *gft)
M0_INTERNAL void m0_be_group_format_reg_get(const struct m0_be_group_format *gft, uint32_t index, struct m0_be_reg_d *rd)
M0_INTERNAL void m0_clink_init(struct m0_clink *link, m0_chan_cb_t cb)
Definition: chan.c:201
M0_INTERNAL void m0_clink_del(struct m0_clink *link)
Definition: chan.c:267
M0_INTERNAL void m0_be_group_format_recovery_prepare(struct m0_be_group_format *gft, struct m0_be_log *log)
static struct be_recovering_tx * tx2tx_group_recovering_tx(struct m0_be_tx *tx)
Definition: tx_group.c:508
m0_bcount_t t_log_reserved_size
Definition: tx.h:378
M0_INTERNAL int m0_be_reg_area_merger_init(struct m0_be_reg_area_merger *brm, int reg_area_nr_max)
Definition: tx_regmap.c:826
m0_be_tx_state
Definition: tx.h:214
M0_INTERNAL void m0_be_group_format_reset(struct m0_be_group_format *gft)
M0_INTERNAL struct m0_sm_group * m0_be_tx_group__sm_group(struct m0_be_tx_group *gr)
Definition: tx_group.c:73
M0_INTERNAL void m0_be_engine__tx_group_ready(struct m0_be_engine *en, struct m0_be_tx_group *gr)
Definition: engine.c:738
static void be_tx_group_tx_to_gr_map(const struct m0_be_tx *tx, const struct m0_be_tx_group *gr)
Definition: tx_group.c:268
M0_INTERNAL void m0_be_tx_group_tx_closed(struct m0_be_tx_group *gr, struct m0_be_tx *tx)
Definition: tx_group.c:325
struct m0_be_log_discard * tgc_log_discard
Definition: tx_group.h:73
M0_INTERNAL void m0_be_tx_group_reconstruct_tx_close(struct m0_be_tx_group *gr, struct m0_be_op *op_gc)
Definition: tx_group.c:601
M0_INTERNAL void m0_be_tx_credit_sub(struct m0_be_tx_credit *c0, const struct m0_be_tx_credit *c1)
Definition: tx_credit.c:55
static struct m0_sm_group * grp
Definition: bytecount.c:38
M0_INTERNAL void m0_be_tx_group_fom_recovery_prepare(struct m0_be_tx_group_fom *m)
Definition: tx_group_fom.c:424
#define M0_LOG(level,...)
Definition: trace.h:167
M0_LEAVE()
M0_INTERNAL void m0_be_tx__recovering_set(struct m0_be_tx *tx)
Definition: tx.c:654
m0_bcount_t tg_payload_prepared
Definition: tx_group.h:110
M0_INTERNAL void m0_be_tx_group__deallocate(struct m0_be_tx_group *gr)
Definition: tx_group.c:408
struct m0_be_domain * tgc_domain
Definition: tx_group.h:68
struct m0_be_domain * tg_domain
Definition: tx_group.h:132
M0_INTERNAL struct m0_be_reg_area * m0_be_tx__reg_area(struct m0_be_tx *tx)
Definition: tx.c:566
M0_INTERNAL void m0_be_group_format_encode(struct m0_be_group_format *gft)
M0_TL_DESCR_DEFINE(rtxs, "m0_be_tx_group::tg_txs_recovering", static, struct be_recovering_tx, rtx_link, rtx_magic, M0_BE_TX_MAGIC, M0_BE_TX_GROUP_MAGIC)
uint64_t t_magic
Definition: tlist.h:296
#define M0_BE_TX_GROUP_TX_ENDFOR
Definition: tx_group.h:265
static void be_tx_group_reconstruct_reg_area(struct m0_be_tx_group *gr)
Definition: tx_group.c:481
static void be_tx_group_reg_area_gather(struct m0_be_tx_group *gr)
Definition: tx_group.c:83
m0_bcount_t br_size
Definition: seg.h:144
uint64_t m0_bindex_t
Definition: types.h:80
uint64_t fgc_tx_nr_max
Definition: fmt.h:238
M0_INTERNAL int m0_be_group_format_allocate(struct m0_be_group_format *gft)
M0_INTERNAL void m0_be_tx_group_fom_stable(struct m0_be_tx_group_fom *gf)
Definition: tx_group_fom.c:412
uint64_t m0_bcount_t
Definition: types.h:77
M0_INTERNAL void m0_be_reg_area_merger_add(struct m0_be_reg_area_merger *brm, struct m0_be_reg_area *ra)
Definition: tx_regmap.c:857
struct m0_be_engine * tg_engine
Definition: tx_group.h:133
#define container_of(ptr, type, member)
Definition: misc.h:33
M0_INTERNAL int m0_be_tx_group_start(struct m0_be_tx_group *gr)
Definition: tx_group.c:393
#define M0_SET0(obj)
Definition: misc.h:64
M0_ADDB2_ADD(M0_AVI_FS_CREATE, new_fid.f_container, new_fid.f_key, mode, rc)
struct m0_be_group_format_cfg tgc_format
Definition: tx_group.h:78
M0_INTERNAL void m0_be_tx_group_fom_reset(struct m0_be_tx_group_fom *m)
Definition: tx_group_fom.c:369
M0_INTERNAL void m0_be_tx_group_reset(struct m0_be_tx_group *gr)
Definition: tx_group.c:178
M0_INTERNAL void m0_be_group_format_discard(struct m0_be_log_discard *ld, struct m0_be_log_discard_item *ldi)
uint64_t rtx_magic
Definition: tx_group.c:51
struct m0_be_pd * tgc_pd
Definition: tx_group.h:74
M0_INTERNAL void m0_be_tx_group_reconstruct_tx_open(struct m0_be_tx_group *gr, struct m0_be_op *op)
Definition: tx_group.c:585
M0_INTERNAL void m0_be_reg_area_capture(struct m0_be_reg_area *ra, struct m0_be_reg_d *rd)
Definition: tx_regmap.c:751
#define M0_BE_REG_AREA_FORALL(ra, rd)
Definition: tx_regmap.h:299
static void be_tx_group_tx_add(struct m0_be_tx_group *gr, struct m0_be_tx *tx)
Definition: tx_group.c:277
#define m0_tl_endfor
Definition: tlist.h:700
M0_INTERNAL void m0_be_reg_area_fini(struct m0_be_reg_area *ra)
Definition: tx_regmap.c:602
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)
Definition: tx_regmap.c:559
struct m0_be_reg rd_reg
Definition: tx_regmap.h:53
return M0_RC(rc)
op
Definition: libdemo.c:64
M0_INTERNAL void m0_be_tx_group_log_write(struct m0_be_tx_group *gr, struct m0_be_op *op)
Definition: tx_group.c:435
#define equi(a, b)
Definition: misc.h:297
M0_INTERNAL void m0_be_group_format_reg_seg_add(struct m0_be_group_format *gft, const struct m0_be_reg_d *rd)
#define M0_ENTRY(...)
Definition: trace.h:170
uint32_t tg_nr_unstable
Definition: tx_group.h:118
M0_INTERNAL void m0_be_tx_group_encode(struct m0_be_tx_group *gr)
Definition: tx_group.c:430
int i
Definition: dir.c:1033
M0_INTERNAL void m0_be_reg_area_reset(struct m0_be_reg_area *ra)
Definition: tx_regmap.c:797
#define PRIu64
Definition: types.h:58
M0_INTERNAL uint32_t m0_be_group_format_reg_nr(const struct m0_be_group_format *gft)
struct m0_be_log * tgc_log
Definition: tx_group.h:72
M0_INTERNAL void m0_be_reg_area_used(struct m0_be_reg_area *ra, struct m0_be_tx_credit *used)
Definition: tx_regmap.c:616
M0_INTERNAL void m0_be_tx_deconstruct(struct m0_be_tx *tx, struct m0_be_fmt_tx *ftx)
Definition: tx.c:664
struct m0_be_tx rtx_tx
Definition: tx_group.c:45
struct m0_be_fmt_group_cfg gfc_fmt_cfg
struct m0_be_op rtx_op_open
Definition: tx_group.c:48
M0_INTERNAL void m0_be_tx_group__tx_state_post(struct m0_be_tx_group *gr, enum m0_be_tx_state state, bool del_tx_from_group)
Definition: tx_group.c:442
M0_INTERNAL int m0_be_tx_group__allocate(struct m0_be_tx_group *gr)
Definition: tx_group.c:403
m0_bcount_t b_nob
Definition: buf.h:38
struct m0_be_tx_credit tgc_size_max
Definition: tx_group.h:61
#define M0_ASSERT(cond)
M0_INTERNAL void m0_be_group_format_seg_place(struct m0_be_group_format *gft, struct m0_be_op *op)
M0_INTERNAL void m0_be_reg_area_merger_merge_to(struct m0_be_reg_area_merger *brm, struct m0_be_reg_area *ra)
Definition: tx_regmap.c:894
M0_INTERNAL void m0_be_tx__group_assign(struct m0_be_tx *tx, struct m0_be_tx_group *gr)
Definition: tx.c:689
M0_INTERNAL void m0_be_group_format_log_write(struct m0_be_group_format *gft, struct m0_be_op *op)
M0_INTERNAL void m0_be_group_format_tx_add(struct m0_be_group_format *gft, struct m0_be_fmt_tx *ftx)
M0_INTERNAL void m0_be_tx_credit_add(struct m0_be_tx_credit *c0, const struct m0_be_tx_credit *c1)
Definition: tx_credit.c:44
struct m0_be_tx_credit tg_used
Definition: tx_group.h:107
struct m0_be_tx_credit tg_size
Definition: tx_group.h:108
#define M0_BE_TX_GROUP_TX_FORALL(gr, tx)
Definition: tx_group.h:262
M0_INTERNAL void m0_be_tx_group_tx_del(struct m0_be_tx_group *gr, struct m0_be_tx *tx)
Definition: tx_group.c:375
static void be_tx_group_payload_gather(struct m0_be_tx_group *gr)
Definition: tx_group.c:114
M0_INTERNAL struct m0_be_seg * m0_be_domain_seg(const struct m0_be_domain *dom, const void *addr)
Definition: domain.c:476
M0_INTERNAL void m0_be_reg_area_captured(struct m0_be_reg_area *ra, struct m0_be_tx_credit *captured)
Definition: tx_regmap.c:637
M0_INTERNAL bool m0_be_tx_group_is_recovering(struct m0_be_tx_group *gr)
Definition: tx_group.c:78
struct m0_be_tx_group_fom tg_fom
Definition: tx_group.h:134
static bool be_tx_group_recovering_tx_open(struct m0_clink *clink)
Definition: tx_group.c:513
M0_INTERNAL void m0_be_group_format_log_use(struct m0_be_group_format *gft, m0_bcount_t size_reserved)
M0_INTERNAL void m0_be_tx_group_fom_init(struct m0_be_tx_group_fom *m, struct m0_be_tx_group *gr, struct m0_reqh *reqh)
Definition: tx_group_fom.c:331
M0_INTERNAL size_t m0_be_tx_group_tx_nr(struct m0_be_tx_group *gr)
Definition: tx_group.c:383
unsigned long tgc_tx_nr_max
Definition: tx_group.h:57
M0_INTERNAL struct m0_sm_group * m0_be_tx_group_fom__sm_group(struct m0_be_tx_group_fom *m)
Definition: tx_group_fom.c:418
m0_bcount_t t_payload_prepared
Definition: tx.h:365
struct m0_fom tgf_gen
Definition: tx_group_fom.h:45
M0_INTERNAL void m0_be_tx_close(struct m0_be_tx *tx)
Definition: stubs.c:194
M0_INTERNAL void m0_be_group_format_reg_log_add(struct m0_be_group_format *gft, const struct m0_be_reg_d *rd)
m0_bcount_t tc_reg_nr
Definition: tx_credit.h:84
struct m0_be_tx_credit tg_log_reserved
Definition: tx_group.h:109
#define M0_POST(cond)
struct m0_reqh * tgc_reqh
Definition: tx_group.h:76
struct m0_be_reg_area_merger tg_merger
Definition: tx_group.h:137
M0_INTERNAL void m0_be_op_done(struct m0_be_op *op)
Definition: stubs.c:104
#define BETXCR_P(c)
Definition: tx_credit.h:113
M0_INTERNAL void m0_be_reg_area_optimize(struct m0_be_reg_area *ra)
Definition: tx_regmap.c:808
M0_INTERNAL int m0_be_group_format_init(struct m0_be_group_format *gft, struct m0_be_group_format_cfg *gft_cfg, struct m0_be_tx_group *group, struct m0_be_log *log)
M0_INTERNAL void m0_be_reg_area_merger_reset(struct m0_be_reg_area_merger *brm)
Definition: tx_regmap.c:852
static struct m0_clink clink[RDWR_REQUEST_MAX]
Definition: seg.h:66
struct m0_sm t_sm
Definition: tx.h:281
M0_INTERNAL m0_bindex_t m0_be_group_format_log_position(const struct m0_be_group_format *gft)
#define PRId64
Definition: types.h:57
static int used
Definition: base.c:304
M0_INTERNAL void m0_be_tx_group_log_read(struct m0_be_tx_group *gr, struct m0_be_op *op)
Definition: tx_group.c:470
M0_INTERNAL void m0_be_tx_group_stop(struct m0_be_tx_group *gr)
Definition: tx_group.c:398
M0_INTERNAL bool m0_be_tx_group__invariant(struct m0_be_tx_group *gr)
Definition: tx_group.c:247
M0_INTERNAL void m0_be_reg_area_merger_fini(struct m0_be_reg_area_merger *brm)
Definition: tx_regmap.c:846
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 void m0_be_tx_group_fom_stop(struct m0_be_tx_group_fom *gf)
Definition: tx_group_fom.c:399
M0_INTERNAL void m0_be_group_format_seg_place_prepare(struct m0_be_group_format *gft)
M0_INTERNAL void m0_be_tx_group_fom_fini(struct m0_be_tx_group_fom *m)
Definition: tx_group_fom.c:359
uint64_t fgc_reg_nr_max
Definition: fmt.h:239
M0_INTERNAL void m0_be_op_reset(struct m0_be_op *op)
Definition: op.c:152
M0_INTERNAL int m0_be_tx_group_tx_add(struct m0_be_tx_group *gr, struct m0_be_tx *tx)
Definition: tx_group.c:286
struct m0_be_tx_group_cfg tg_cfg
Definition: tx_group.h:105
M0_INTERNAL void m0_be_group_format_fini(struct m0_be_group_format *gft)
M0_INTERNAL void m0_be_op_active(struct m0_be_op *op)
Definition: stubs.c:100
M0_INTERNAL void m0_be_tx_group_seg_place_prepare(struct m0_be_tx_group *gr)
Definition: tx_group.c:413
#define M0_CNT_INC(cnt)
Definition: arith.h:226
M0_INTERNAL uint32_t m0_be_group_format_tx_nr(const struct m0_be_group_format *gft)
static void be_tx_group_deconstruct(struct m0_be_tx_group *gr)
Definition: tx_group.c:129
M0_INTERNAL void m0_be_tx_reconstruct(struct m0_be_tx *tx, const struct m0_be_fmt_tx *ftx)
Definition: tx.c:670
struct m0_be_engine * tgc_engine
Definition: tx_group.h:70
struct m0_chan sm_chan
Definition: sm.h:331
M0_INTERNAL void m0_clink_add(struct m0_chan *chan, struct m0_clink *link)
Definition: chan.c:228
M0_INTERNAL void m0_be_reg_area_prepared(struct m0_be_reg_area *ra, struct m0_be_tx_credit *prepared)
Definition: tx_regmap.c:629
M0_INTERNAL void m0_be_tx_group_fini(struct m0_be_tx_group *gr)
Definition: tx_group.c:252
M0_INTERNAL void m0_be_tx_open(struct m0_be_tx *tx)
Definition: stubs.c:184
void * rd_buf
Definition: tx_regmap.h:58
static void be_tx_group_reconstruct_transactions(struct m0_be_tx_group *gr, struct m0_sm_group *sm_grp)
Definition: tx_group.c:541
M0_INTERNAL void m0_be_op_fini(struct m0_be_op *op)
Definition: stubs.c:92
M0_INTERNAL void m0_clink_fini(struct m0_clink *link)
Definition: chan.c:208
M0_INTERNAL void m0_be_op_set_add(struct m0_be_op *parent, struct m0_be_op *child)
Definition: op.c:297
M0_INTERNAL m0_bcount_t m0_be_group_format_log_reserved_size(struct m0_be_log *log, struct m0_be_tx_credit *cred, m0_bcount_t cred_payload)
struct m0_buf t_payload
Definition: tx.h:364
M0_INTERNAL bool m0_be_tx__is_recovering(struct m0_be_tx *tx)
Definition: tx.c:659
M0_INTERNAL int m0_be_tx_group_decode(struct m0_be_tx_group *gr)
Definition: tx_group.c:476
M0_INTERNAL void m0_be_tx_gc_enable(struct m0_be_tx *tx, void(*gc_free)(struct m0_be_tx *, void *param), void *param)
Definition: tx.c:728
static struct m0_be_seg * seg
Definition: btree.c:40
M0_INTERNAL int m0_be_tx_group_reapply(struct m0_be_tx_group *gr, struct m0_be_op *op)
Definition: tx_group.c:620
struct m0_sm fo_sm_phase
Definition: fom.h:522
#define M0_ASSERT_INFO(cond, fmt,...)
M0_INTERNAL int m0_be_group_format_decode(struct m0_be_group_format *gft)
M0_INTERNAL const char * m0_be_tx_state_name(enum m0_be_tx_state state)
Definition: tx.c:417
M0_INTERNAL void m0_be_tx_group_stable(struct m0_be_tx_group *gr)
Definition: tx_group.c:65
Definition: log.h:261
M0_INTERNAL bool m0_be_tx_credit_le(const struct m0_be_tx_credit *c0, const struct m0_be_tx_credit *c1)
Definition: tx_credit.c:98
M0_INTERNAL int m0_be_tx_group_reconstruct(struct m0_be_tx_group *gr, struct m0_sm_group *sm_grp)
Definition: tx_group.c:577
struct m0_tl tg_txs
Definition: tx_group.h:120
struct m0_clink rtx_open_wait
Definition: tx_group.c:47
Definition: op.h:74
M0_INTERNAL uint64_t m0_sm_id_get(const struct m0_sm *sm)
Definition: sm.c:1021
unsigned long tgc_seg_nr_max
Definition: tx_group.h:59
#define m0_tl_for(name, head, obj)
Definition: tlist.h:695
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_tx__state_post(struct m0_be_tx *tx, enum m0_be_tx_state state)
Definition: tx.c:524
struct m0_be_seg * br_seg
Definition: seg.h:143
M0_INTERNAL void m0_be_tx_group_open(struct m0_be_tx_group *gr)
Definition: tx_group.c:388
M0_TL_DEFINE(rtxs, static, struct be_recovering_tx)
void * br_addr
Definition: seg.h:145
int32_t rc
Definition: trigger_fop.h:47
uint32_t tg_nr_unclosed
Definition: tx_group.h:114
struct m0_be_op rtx_op_gc
Definition: tx_group.c:49
M0_INTERNAL void m0_be_group_format_tx_get(const struct m0_be_group_format *gft, uint32_t index, struct m0_be_fmt_tx *ftx)
m0_bcount_t tc_reg_size
Definition: tx_credit.h:86
M0_INTERNAL void m0_be_tx_group_fom_handle(struct m0_be_tx_group_fom *m)
Definition: tx_group_fom.c:407
Definition: tx.h:280
M0_INTERNAL void m0_be_log_unreserve(struct m0_be_log *log, m0_bcount_t size)
Definition: log.c:868
struct m0_be_log * tg_log
Definition: tx_group.h:131
M0_INTERNAL void m0_be_tx_group_prepare(struct m0_be_tx_group *gr, struct m0_be_op *op)
Definition: tx_group.c:195
bool tg_recovering
Definition: tx_group.h:136