Motr  M0
ag.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_SNSCM
24 #include "lib/trace.h"
25 
26 #include "lib/memory.h"
27 #include "lib/errno.h"
28 #include "lib/misc.h"
29 #include "lib/arith.h"
30 
31 #include "fid/fid.h"
32 #include "sns/parity_repair.h"
33 
34 #include "cm/proxy.h"
35 
36 #include "sns/cm/cm_utils.h"
37 #include "sns/cm/repair/ag.h"
38 #include "sns/cm/cp.h"
39 #include "sns/cm/file.h"
40 #include "sns/cm/cm.h"
41 #include "ioservice/fid_convert.h" /* m0_fid_cob_device_id */
42 
49 M0_INTERNAL void m0_sns_cm_acc_cp_init(struct m0_sns_cm_cp *scp,
50  struct m0_sns_cm_ag *ag);
51 
52 M0_INTERNAL int m0_sns_cm_acc_cp_setup(struct m0_sns_cm_cp *scp,
53  struct m0_fid *tgt_cobfid,
54  uint64_t tgt_cob_index,
55  uint64_t failed_unit_idx,
56  uint64_t data_seg_nr);
57 
58 M0_INTERNAL int repair_cp_bufvec_split(struct m0_cm_cp *cp);
59 
60 M0_INTERNAL struct m0_sns_cm_repair_ag *
62 {
64 }
65 
66 M0_INTERNAL int64_t m0_sns_cm_repair_ag_inbufs(struct m0_sns_cm *scm,
67  struct m0_sns_cm_file_ctx *fctx,
68  const struct m0_cm_ag_id *id)
69 {
70  uint64_t nr_cp_bufs;
71  uint64_t cp_data_seg_nr;
72  uint64_t nr_acc_bufs;
73  int64_t nr_in_bufs;
75 
76  cp_data_seg_nr = m0_sns_cm_data_seg_nr(scm, pl);
77  /*
78  * Calculate number of buffers required for a copy packet.
79  * This depends on the unit size and the max buffer size.
80  */
81  nr_cp_bufs = m0_sns_cm_cp_buf_nr(&scm->sc_ibp.sb_bp, cp_data_seg_nr);
82  /* Calculate number of buffers required for incoming copy packets. */
83  nr_in_bufs = m0_sns_cm_incoming_reserve_bufs(scm, id);
84  if (nr_in_bufs < 0)
85  return nr_in_bufs;
86  /* Calculate number of buffers required for accumulator copy packets. */
87  nr_acc_bufs = nr_cp_bufs * m0_sns_cm_ag_unrepaired_units(scm, fctx,
88  id->ai_lo.u_lo, NULL);
89  return nr_in_bufs + nr_acc_bufs;
90 }
91 
93 {
94  struct m0_cm_cp *cp;
95  struct m0_net_buffer *nbuf_head;
96  int rc = 0;
97  int i;
98 
99  M0_PRE(rag != NULL);
100 
101  for (i = 0; i < rag->rag_base.sag_fnr; ++i) {
102  if (!rag->rag_fc[i].fc_is_inuse)
103  continue;
104  cp = &rag->rag_fc[i].fc_tgt_acc_cp.sc_base;
106  nbuf_head = cp_data_buf_tlist_head(&cp->c_buffers);
109  &rag->rag_ir);
110  if (rc != 0)
111  break;
112  }
113 
114  return M0_RC(rc);
115 }
116 
118  struct m0_pdclust_layout *pl)
119 {
120  uint64_t local_cp_nr;
121  int rc;
122 
123  M0_PRE(rag != NULL);
124  M0_PRE(pl != NULL);
125 
126  /*
127  * No need of parity math for N = 1 configuration.
128  */
129  if (m0_pdclust_is_replicated(pl))
130  return 0;
131 
132  M0_SET0(&rag->rag_math);
133  M0_SET0(&rag->rag_ir);
134 
137  if (rc != 0)
138  return M0_RC(rc);
139 
140  if (m0_sns_cm_ag_nr_parity_units(pl) == 1)
141  return 0;
142 
143  local_cp_nr = rag->rag_base.sag_base.cag_cp_local_nr;
144  rc = m0_sns_ir_init(&rag->rag_math, local_cp_nr, &rag->rag_ir);
145  if (rc != 0) {
147  return M0_RC(rc);
148  }
149 
151  if (rc != 0)
152  goto err;
153 
155  if (rc != 0)
156  goto err;
157 
158  return M0_RC(rc);
159 err:
162  return M0_RC(rc);
163 }
164 
166 {
169 }
170 
176 {
177  struct m0_sns_cm_ag *sag = &rag->rag_base;
178  struct m0_cm_aggr_group *ag = &sag->sag_base;
179  struct m0_sns_cm *scm = cm2sns(ag->cag_cm);
181  uint32_t nr_cp_bufs;
182  uint32_t nr_incoming_freed;
183 
184  nr_cp_bufs = m0_sns_cm_cp_buf_nr(&scm->sc_ibp.sb_bp,
186  nr_incoming_freed = ag->cag_freed_cp_nr -
188  return (sag->sag_incoming_cp_nr - nr_incoming_freed) * nr_cp_bufs;
189 }
190 
192 {
193  struct m0_cm_cp *cp;
194  struct m0_sns_cm_ag *sag = &rag->rag_base;
195  struct m0_cm_aggr_group *ag = &sag->sag_base;
196  struct m0_sns_cm *scm = cm2sns(ag->cag_cm);
198  uint32_t nr_cp_bufs;
199  uint32_t unused_cps = 0;
200  uint32_t nr_bufs;
201  uint32_t nr_rem_bufs;
202  int i;
203 
204  M0_PRE(rag != NULL);
205 
206  nr_cp_bufs = m0_sns_cm_cp_buf_nr(&scm->sc_ibp.sb_bp,
208  for (i = 0; i < sag->sag_fnr; ++i) {
209  if (!rag->rag_fc[i].fc_is_inuse) {
210  M0_CNT_INC(unused_cps);
211  continue;
212  }
213  cp = &rag->rag_fc[i].fc_tgt_acc_cp.sc_base;
214  if (cp->c_buf_nr > 0) {
216  cp->c_ops->co_free(cp);
217  }
218  }
219  /* While reserving incoming buffers, we consider all the
220  * accumulators, in-order to avoid buffer leakage, normalize
221  * the reservation if any of the accumulators is not in use.
222  */
223  if (ag->cag_has_incoming) {
224  nr_rem_bufs = ag_in_remaining_bufs(rag);
225  nr_bufs = unused_cps * nr_cp_bufs + nr_rem_bufs;
227  }
228 }
229 
230 static void repair_ag_fini(struct m0_cm_aggr_group *ag)
231 {
232  struct m0_sns_cm_ag *sag;
233  struct m0_sns_cm_repair_ag *rag;
234 
235  M0_ENTRY();
236  M0_PRE(ag != NULL);
237 
238  sag = ag2snsag(ag);
239  rag = sag2repairag(sag);
241 
242  /* In-case the aggregation group is being forcefully finalised
243  * (e.g. quiesce or abort), we need to release accumulator copy packet
244  * buffers.
245  */
249  m0_free(rag->rag_fc);
250  m0_free(rag);
251 
252  M0_LEAVE();
253 }
254 
255 static uint32_t repair_ag_inactive_acc_nr(struct m0_cm_aggr_group *ag)
256 {
257  struct m0_sns_cm_ag *sag = ag2snsag(ag);
259  uint32_t inactive_acc_nr = 0;
260  int i;
261 
262  for (i = 0; i < sag->sag_fnr; ++i) {
264  M0_CNT_INC(inactive_acc_nr);
265  }
266 
267  if (inactive_acc_nr >= rag->rag_acc_freed)
268  return inactive_acc_nr - rag->rag_acc_freed;
269  else
270  return rag->rag_acc_freed - inactive_acc_nr;
271 }
272 
273 static bool repair_ag_can_fini(const struct m0_cm_aggr_group *ag)
274 {
275  struct m0_sns_cm_ag *sag = ag2snsag(ag);
277  uint32_t inactive_accs = 0;
278 
279  if (ag->cag_is_frozen || ag->cag_rc != 0) {
280  inactive_accs = repair_ag_inactive_acc_nr(&sag->sag_base);
281  return ag->cag_ref == inactive_accs;
282  }
283 
284  return (rag->rag_acc_inuse_nr == rag->rag_acc_freed) &&
285  (ag->cag_transformed_cp_nr ==
287 }
288 
291  .cago_fini = repair_ag_fini,
292  .cago_local_cp_nr = m0_sns_cm_ag_local_cp_nr,
293  .cago_has_incoming_from = m0_sns_cm_ag_has_incoming_from,
294  .cago_is_frozen_on = m0_sns_cm_ag_is_frozen_on
295 };
296 
297 static uint64_t repair_ag_target_unit(struct m0_sns_cm_ag *sag,
298  struct m0_pdclust_layout *pl,
299  struct m0_pdclust_instance *pi,
300  uint64_t fdev, uint64_t funit)
301 {
302  struct m0_poolmach *pm;
303  struct m0_fid gfid;
304  uint64_t group;
305  uint32_t tgt_unit;
306  uint32_t tgt_unit_prev;
307  int rc;
308 
309  pm = sag->sag_fctx->sf_pm;
310 
314  rc = m0_sns_repair_spare_map(pm, &gfid, pl, pi,
315  group, funit, &tgt_unit, &tgt_unit_prev);
317  if (rc != 0)
318  tgt_unit = ~0;
319 
320  return tgt_unit;
321 }
322 
324  const struct m0_bitmap *fmap,
325  struct m0_pdclust_layout *pl)
326 {
327  struct m0_sns_cm_ag *sag = &rag->rag_base;
328  struct m0_sns_cm_file_ctx *fctx;
329  struct m0_cm *cm = snsag2cm(sag);
330  struct m0_sns_cm_repair_ag_failure_ctx *rag_fc;
331  struct m0_fid fid;
332  struct m0_fid cobfid;
333  struct m0_fid *tgt_cobfid;
335  bool local;
336  enum m0_pool_nd_state state_out;
337  uint64_t tgt_unit;
338  uint64_t fidx = 0;
339  uint64_t group;
340  uint64_t data_unit_id_out;
341  int i;
342  int rc = 0;
343  struct m0_poolmach *pm;
344  uint32_t index;
345 
346  M0_PRE(fmap != NULL);
347  M0_PRE(fmap->b_nr == m0_sns_cm_ag_size(pl));
348 
349  fctx = sag->sag_fctx;
350  pm = fctx->sf_pm;
353  for (i = 0; i < fmap->b_nr; ++i) {
354  if (!m0_bitmap_get(fmap, i))
355  continue;
357  continue;
358  /*
359  * Check if the failed index is spare, which means that
360  * this is failure after repair has been done atleast
361  * once. This also means that rebalance has not been
362  * invoked yet.
363  */
366  rc = m0_sns_repair_data_map(pm, pl, pi, group,
367  i, &data_unit_id_out);
369  if (rc != 0)
370  return M0_RC(rc);
371  /*
372  * If the mapped data unit @data_unit_id_out
373  * corresponding to spare unit @i is same as the spare
374  * unit @i then ignore and nove to next failed unit in
375  * the parity group.
376  */
377  if (data_unit_id_out == i)
378  continue;
379  } else
380  data_unit_id_out = i;
381 
382  /*
383  * Move to next failed unit in the parity group if the mapped
384  * data unit @data_unit_id_out is another spare unit in the
385  * aggregation group (i.e N + K < i < N + 2K).
386  */
388  data_unit_id_out))
389  continue;
390  rc = m0_sns_cm_ag_tgt_unit2cob(sag, data_unit_id_out,
391  &cobfid);
392  if (rc != 0)
393  return M0_RC(rc);
394  index = m0_sns_cm_device_index_get(group, data_unit_id_out, fctx);
395  /*
396  * Failed unit is data/parity unit.
397  * Check the device state for the device hosting the failed unit.
398  * If the device state == M0_PNDS_SNS_REPAIRED, means failed
399  * unit @i was already repaired in previous sns repair operation.
400  * Hence move to next failed unit in the aggregation group.
401  */
402  if (data_unit_id_out == i) {
403  rc = m0_poolmach_device_state(pm, index, &state_out);
404  if (rc != 0)
405  return M0_RC(rc);
406  if (state_out == M0_PNDS_SNS_REPAIRED)
407  continue;
408  }
409 
410  tgt_unit = repair_ag_target_unit(sag, pl, pi, index,
411  data_unit_id_out);
412  rag_fc = &rag->rag_fc[fidx];
413  tgt_cobfid = &rag_fc->fc_tgt_cobfid;
414  rc = m0_sns_cm_ag_tgt_unit2cob(sag, tgt_unit, tgt_cobfid);
415  if (rc != 0)
416  return M0_RC(rc);
417  /*
418  * Number of accumulators allocated == number of failures in an
419  * aggregation group.
420  * So, if the target cob (cob hosting the spare unit) for the
421  * given accumulator is not local and there are no local units
422  * for the given aggregation group then this accumulator is not
423  * used, thus not freed, this holds the aggregation group
424  * finalisation. Thus mark the accumulator if it is used.
425  * (struct m0_sns_cm_repair_ag_failure_ctx::fc_is_inuse) and
426  * also account the number of used accumulators in an
427  * aggregation group,
428  * (struct m0_sns_cm_repair_ag::rag_acc_inuse_nr). Use this
429  * information to finalise an aggregation group.
430  */
431  local = m0_sns_cm_is_local_cob(cm, pm->pm_pver, tgt_cobfid);
432  if (local || sag->sag_base.cag_cp_local_nr != 0) {
433  rag_fc->fc_failed_idx = data_unit_id_out;
434  rag_fc->fc_tgt_idx = tgt_unit;
435  rag_fc->fc_tgt_cob_index =
436  m0_sns_cm_ag_unit2cobindex(sag, tgt_unit);
438  rag_fc->fc_is_inuse = true;
439  if (local)
441  }
442  if (rag_fc->fc_is_inuse &&
444  &rag_fc->fc_tgt_cobfid))
446  ++fidx;
447  }
448 
449  M0_POST(fidx <= sag->sag_fnr);
450  return M0_RC(rc);
451 }
452 
453 M0_INTERNAL int m0_sns_cm_repair_ag_alloc(struct m0_cm *cm,
454  const struct m0_cm_ag_id *id,
455  bool has_incoming,
456  struct m0_cm_aggr_group **out)
457 {
458  struct m0_sns_cm_repair_ag *rag;
459  struct m0_sns_cm_repair_ag_failure_ctx *rag_fc;
460  struct m0_sns_cm_ag *sag = NULL;
461  struct m0_pdclust_layout *pl = NULL;
462  uint64_t f_nr;
463  int i;
464  int rc = 0;
465 
466  M0_ENTRY("scm: %p, ag id:%p", cm, id);
467  M0_PRE(cm != NULL && id != NULL && out != NULL);
469 
470  /* Allocate new aggregation group. */
471  M0_ALLOC_PTR(rag);
472  if (rag == NULL)
473  return M0_ERR(-ENOMEM);
475  has_incoming);
476  if (rc != 0) {
477  m0_free(rag);
478  return M0_RC(rc);
479  }
480  f_nr = rag->rag_base.sag_fnr;
481  M0_ALLOC_ARR(rag->rag_fc, f_nr);
482  if (rag->rag_fc == NULL) {
483  rc = M0_ERR(-ENOMEM);
484  goto cleanup_ag;
485  }
486  sag = &rag->rag_base;
488  /* Set the target cob fid of accumulators for this aggregation group. */
490  if (rc != 0)
491  goto cleanup_ag;
492 
493  /* Initialise the accumulators. */
494  for (i = 0; i < sag->sag_fnr; ++i) {
495  rag_fc = &rag->rag_fc[i];
496  if (rag_fc->fc_is_inuse)
498  }
499 
500  /* Acquire buffers and setup the accumulators. */
502  if (rc != 0 && rc != -ENOBUFS)
503  goto cleanup_acc;
504  *out = &sag->sag_base;
505  goto done;
506 
507 cleanup_acc:
508  for (i = 0; i < sag->sag_fnr; ++i) {
509  rag_fc = &rag->rag_fc[i];
510  if (rag_fc->fc_is_inuse)
512  }
513 cleanup_ag:
514  M0_LOG(M0_ERROR, "cleaning up group rc: %d", rc);
517  m0_free(rag->rag_fc);
518  m0_free(rag);
519 done:
520  M0_LEAVE("ag: %p", &sag->sag_base);
521  M0_ASSERT(rc <= 0);
522  return M0_RC(rc);
523 }
524 
526  struct m0_pdclust_layout *pl)
527 {
528  struct m0_sns_cm *scm;
530  struct m0_sns_cm_repair_ag_failure_ctx *rag_fc;
531  struct m0_fid gfid;
532  uint64_t cp_data_seg_nr;
533  int i;
534  int rc = 0;
535 
536  M0_PRE(sag != NULL);
537 
539  cp_data_seg_nr = m0_sns_cm_data_seg_nr(scm, pl);
540  for (i = 0; i < sag->sag_fnr; ++i) {
541  rag_fc = &rag->rag_fc[i];
542  if (rag_fc->fc_is_inuse) {
544  &rag_fc->fc_tgt_cobfid,
545  rag_fc->fc_tgt_cob_index,
546  rag_fc->fc_failed_idx,
547  cp_data_seg_nr);
548  }
549  if (rc != 0)
550  return M0_RC(rc);
551  }
552 
554  return incr_recover_init(rag, pl);
555 }
556 
562 M0_INTERNAL bool m0_sns_cm_ag_acc_is_full_with(const struct m0_cm_cp *acc,
563  uint64_t nr_cps)
564 {
565  int i;
566  uint64_t xform_cp_nr = 0;
567 
568  for (i = 0; i < acc->c_xform_cp_indices.b_nr; ++i) {
569  if (m0_bitmap_get(&acc->c_xform_cp_indices, i))
570  M0_CNT_INC(xform_cp_nr);
571  }
572 
573  return xform_cp_nr >= nr_cps;
574 }
575 
577 #undef M0_TRACE_SUBSYSTEM
578 
579 /*
580  * Local variables:
581  * c-indentation-style: "K&R"
582  * c-basic-offset: 8
583  * tab-width: 8
584  * fill-column: 79
585  * scroll-step: 1
586  * End:
587  */
M0_INTERNAL uint64_t m0_sns_cm_ag_nr_data_units(const struct m0_pdclust_layout *pl)
Definition: cm_utils.c:222
uint64_t id
Definition: cob.h:2380
Definition: cm.h:205
M0_INTERNAL uint64_t m0_sns_cm_ag_local_cp_nr(const struct m0_cm_aggr_group *ag)
Definition: ag.c:420
static struct m0_dtm_local_remote local
Definition: transmit.c:71
M0_INTERNAL void m0_parity_math_fini(struct m0_parity_math *math)
Definition: parity_math.c:325
#define M0_PRE(cond)
M0_INTERNAL bool m0_pdclust_is_replicated(struct m0_pdclust_layout *play)
Definition: pdclust.c:829
#define M0_ALLOC_ARR(arr, nr)
Definition: memory.h:84
M0_INTERNAL void agid2fid(const struct m0_cm_ag_id *id, struct m0_fid *fid)
Definition: ag.c:405
M0_INTERNAL int m0_sns_cm_repair_ag_setup(struct m0_sns_cm_ag *sag, struct m0_pdclust_layout *pl)
Definition: ag.c:525
struct m0_parity_math rag_math
Definition: ag.h:96
#define NULL
Definition: misc.h:38
M0_INTERNAL void m0_bitmap_fini(struct m0_bitmap *map)
Definition: bitmap.c:97
struct m0_bitmap c_xform_cp_indices
Definition: cp.h:181
struct m0_bufvec nb_buffer
Definition: net.h:1322
static int incr_recover_init(struct m0_sns_cm_repair_ag *rag, struct m0_pdclust_layout *pl)
Definition: ag.c:117
struct m0_bitmap sag_fmap
Definition: ag.h:84
M0_INTERNAL struct m0_sns_cm * cm2sns(struct m0_cm *cm)
Definition: cm.c:389
static void incr_recover_fini(struct m0_sns_cm_repair_ag *rag)
Definition: ag.c:165
struct m0_pool_version * pm_pver
Definition: pool_machine.h:172
#define M0_LOG(level,...)
Definition: trace.h:167
Definition: cp.h:160
M0_LEAVE()
static const struct m0_cm_aggr_group_ops sns_cm_repair_ag_ops
Definition: ag.c:289
static int incr_recover_failure_register(struct m0_sns_cm_repair_ag *rag)
Definition: ag.c:92
M0_INTERNAL bool m0_sns_cm_is_local_cob(const struct m0_cm *cm, const struct m0_pool_version *pv, const struct m0_fid *cob_fid)
Definition: cm_utils.c:449
M0_INTERNAL int m0_sns_repair_spare_map(struct m0_poolmach *pm, const struct m0_fid *fid, struct m0_pdclust_layout *pl, struct m0_pdclust_instance *pi, uint64_t group, uint64_t unit, uint32_t *spare_slot_out, uint32_t *spare_slot_out_prev)
uint32_t rag_acc_inuse_nr
Definition: ag.h:86
struct m0_layout * sf_layout
Definition: file.h:74
struct m0_cm_ag_id cag_id
Definition: ag.h:72
M0_INTERNAL void m0_sns_cm_fctx_unlock(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:58
M0_INTERNAL int m0_sns_cm_acc_cp_setup(struct m0_sns_cm_cp *scp, struct m0_fid *tgt_cobfid, uint64_t tgt_cob_index, uint64_t failed_unit_idx, uint64_t data_seg_nr)
Definition: acc_cp.c:130
static struct m0_sns_cm * scm
Definition: cm.c:64
M0_INTERNAL int repair_cp_bufvec_split(struct m0_cm_cp *cp)
Definition: xform.c:47
M0_INTERNAL void m0_sns_cm_ag_fini(struct m0_sns_cm_ag *sag)
Definition: ag.c:443
M0_INTERNAL uint64_t m0_sns_cm_ag_nr_parity_units(const struct m0_pdclust_layout *pl)
Definition: cm_utils.c:228
M0_INTERNAL int m0_poolmach_device_state(struct m0_poolmach *pm, uint32_t device_index, enum m0_pool_nd_state *state_out)
Definition: pool_machine.c:816
struct m0_sns_cm_buf_pool sc_ibp
Definition: cm.h:227
#define container_of(ptr, type, member)
Definition: misc.h:33
#define M0_SET0(obj)
Definition: misc.h:64
M0_INTERNAL int m0_sns_cm_ag_tgt_unit2cob(struct m0_sns_cm_ag *sag, uint64_t tgt_unit, struct m0_fid *cobfid)
Definition: cm_utils.c:381
struct m0_poolmach * sf_pm
Definition: file.h:70
M0_INTERNAL void m0_sns_ir_fini(struct m0_sns_ir *ir)
Definition: parity_math.c:488
static uint32_t repair_ag_inactive_acc_nr(struct m0_cm_aggr_group *ag)
Definition: ag.c:255
M0_INTERNAL uint64_t m0_sns_cm_ag_unit2cobindex(struct m0_sns_cm_ag *sag, uint64_t unit)
Definition: cm_utils.c:143
uint32_t sag_fnr
Definition: ag.h:51
M0_INTERNAL int m0_sns_ir_failure_register(struct m0_bufvec *recov_addr, uint32_t failed_index, struct m0_sns_ir *ir)
Definition: parity_math.c:453
M0_INTERNAL int m0_sns_ir_init(const struct m0_parity_math *math, uint32_t local_nr, struct m0_sns_ir *ir)
Definition: parity_math.c:425
struct m0_fid fid
Definition: di.c:46
static void acc_check_fini(struct m0_sns_cm_repair_ag *rag)
Definition: ag.c:191
return M0_RC(rc)
static struct m0_cm * cm
Definition: cm.c:63
M0_INTERNAL uint64_t agid2group(const struct m0_cm_ag_id *id)
Definition: ag.c:413
#define M0_ENTRY(...)
Definition: trace.h:170
bool cag_is_frozen
Definition: ag.h:106
static struct m0_sns_cm_ag * sag
Definition: cm.c:66
int i
Definition: dir.c:1033
struct m0_cm_cp sc_base
Definition: cp.h:39
return M0_ERR(-EOPNOTSUPP)
M0_INTERNAL bool m0_sns_cm_ag_is_frozen_on(struct m0_cm_aggr_group *ag, struct m0_cm_proxy *pxy)
Definition: ag.c:541
M0_INTERNAL uint32_t m0_sns_cm_device_index_get(uint64_t group, uint64_t unit_number, struct m0_sns_cm_file_ctx *fctx)
Definition: cm_utils.c:126
struct m0_sns_cm_ag rag_base
Definition: ag.h:77
struct m0_sns_ir rag_ir
Definition: ag.h:99
int cag_rc
Definition: ag.h:126
uint32_t sag_outgoing_nr
Definition: ag.h:75
M0_INTERNAL size_t m0_sns_cm_ag_unrepaired_units(const struct m0_sns_cm *scm, struct m0_sns_cm_file_ctx *fctx, uint64_t group, struct m0_bitmap *fmap_out)
Definition: cm_utils.c:464
#define M0_ASSERT(cond)
static int repair_ag_failure_ctxs_setup(struct m0_sns_cm_repair_ag *rag, const struct m0_bitmap *fmap, struct m0_pdclust_layout *pl)
Definition: ag.c:323
M0_INTERNAL bool m0_sns_cm_ag_has_incoming_from(struct m0_cm_aggr_group *ag, struct m0_cm_proxy *proxy)
Definition: ag.c:528
struct m0_fid fc_tgt_cobfid
Definition: ag.h:60
m0_pool_nd_state
Definition: pool_machine.h:57
struct m0_cm * cag_cm
Definition: ag.h:70
M0_INTERNAL uint64_t m0_sns_cm_cp_buf_nr(struct m0_net_buffer_pool *bp, uint64_t data_seg_nr)
Definition: cm.c:795
uint64_t cag_ref
Definition: ag.h:80
const struct m0_cm_cp_ops * c_ops
Definition: cp.h:169
M0_INTERNAL int m0_sns_cm_repair_ag_alloc(struct m0_cm *cm, const struct m0_cm_ag_id *id, bool has_incoming, struct m0_cm_aggr_group **out)
Definition: ag.c:453
M0_INTERNAL int m0_sns_ir_mat_compute(struct m0_sns_ir *ir)
Definition: parity_math.c:482
M0_INTERNAL struct m0_pdclust_layout * m0_layout_to_pdl(const struct m0_layout *l)
Definition: pdclust.c:382
M0_INTERNAL int m0_parity_math_init(struct m0_parity_math *math, uint32_t data_count, uint32_t parity_count)
Definition: parity_math.c:333
struct m0_pdclust_instance pi
Definition: fd.c:107
#define M0_POST(cond)
struct m0_sns_cm_cp fc_tgt_acc_cp
Definition: ag.h:45
M0_INTERNAL int m0_sns_repair_data_map(struct m0_poolmach *pm, struct m0_pdclust_layout *pl, struct m0_pdclust_instance *pi, uint64_t group_number, uint64_t spare_unit_number, uint64_t *data_unit_id_out)
static void group(void)
Definition: sm.c:386
struct m0_sm_ast * sa_next
Definition: sm.h:509
M0_INTERNAL void m0_sns_cm_fctx_lock(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:53
uint32_t sag_incoming_cp_nr
Definition: ag.h:72
M0_INTERNAL int m0_cm_cp_bufvec_merge(struct m0_cm_cp *cp)
Definition: cp.c:752
struct m0_sm_ast cag_fini_ast
Definition: ag.h:78
uint64_t cag_transformed_cp_nr
Definition: ag.h:95
M0_INTERNAL struct m0_cm * snsag2cm(const struct m0_sns_cm_ag *sag)
Definition: ag.c:386
static uint64_t repair_ag_target_unit(struct m0_sns_cm_ag *sag, struct m0_pdclust_layout *pl, struct m0_pdclust_instance *pi, uint64_t fdev, uint64_t funit)
Definition: ag.c:297
M0_INTERNAL bool m0_sns_cm_ag_acc_is_full_with(const struct m0_cm_cp *acc, uint64_t nr_cps)
Definition: ag.c:562
struct m0_sns_cm_file_ctx * sag_fctx
Definition: ag.h:48
struct m0_sns_cm_repair_ag_failure_ctx * rag_fc
Definition: ag.h:93
uint32_t c_buf_nr
Definition: cp.h:187
static void repair_ag_fini(struct m0_cm_aggr_group *ag)
Definition: ag.c:230
M0_INTERNAL int m0_sns_cm_ag_init(struct m0_sns_cm_ag *sag, struct m0_cm *cm, const struct m0_cm_ag_id *id, const struct m0_cm_aggr_group_ops *ag_ops, bool has_incoming)
Definition: ag.c:464
struct m0_net_buffer_pool sb_bp
Definition: cm.h:135
#define M0_CNT_INC(cnt)
Definition: arith.h:226
uint64_t cag_freed_cp_nr
Definition: ag.h:98
M0_INTERNAL void m0_cm_aggr_group_fini(struct m0_cm_aggr_group *ag)
Definition: ag.c:180
Definition: fid.h:38
M0_INTERNAL uint64_t m0_sns_cm_data_seg_nr(struct m0_sns_cm *scm, struct m0_pdclust_layout *pl)
Definition: cm.c:845
uint32_t sag_local_tgts_nr
Definition: ag.h:78
M0_INTERNAL uint64_t m0_sns_cm_ag_size(const struct m0_pdclust_layout *pl)
Definition: cm_utils.c:239
static struct m0_sns_cm_cp scp
Definition: cm.c:65
#define M0_ALLOC_PTR(ptr)
Definition: memory.h:86
M0_INTERNAL int64_t m0_sns_cm_repair_ag_inbufs(struct m0_sns_cm *scm, struct m0_sns_cm_file_ctx *fctx, const struct m0_cm_ag_id *id)
Definition: ag.c:66
Definition: cm.h:166
M0_INTERNAL bool m0_bitmap_get(const struct m0_bitmap *map, size_t idx)
Definition: bitmap.c:105
M0_INTERNAL enum m0_pdclust_unit_type m0_pdclust_unit_classify(const struct m0_pdclust_layout *pl, int unit)
Definition: pdclust.c:425
uint32_t rag_acc_freed
Definition: ag.h:83
M0_INTERNAL bool m0_sns_cm_unit_is_spare(struct m0_sns_cm_file_ctx *fctx, uint64_t group_nr, uint64_t spare_nr)
Definition: cm_utils.c:277
uint64_t cag_cp_local_nr
Definition: ag.h:92
M0_INTERNAL void m0_sns_cm_cancel_reservation(struct m0_sns_cm *scm, size_t nr_bufs)
Definition: cm.c:926
void(* co_free)(struct m0_cm_cp *cp)
Definition: cp.h:250
struct m0_tl c_buffers
Definition: cp.h:184
M0_INTERNAL void m0_sns_cm_cp_buf_release(struct m0_cm_cp *cp)
Definition: cp.c:326
uint32_t sag_cp_created_nr
Definition: ag.h:60
M0_INTERNAL int64_t m0_sns_cm_incoming_reserve_bufs(struct m0_sns_cm *scm, const struct m0_cm_ag_id *id)
Definition: cm.c:859
struct m0_pdclust_instance * sf_pi
Definition: file.h:77
static struct m0_sns_cm_file_ctx fctx
Definition: net.c:55
static unsigned done
Definition: storage.c:91
static struct m0_sns_cm_repair_ag rag
Definition: net.c:54
bool cag_has_incoming
Definition: ag.h:101
#define out(...)
Definition: gen.c:41
struct m0_cm_aggr_group sag_base
Definition: ag.h:46
size_t b_nr
Definition: bitmap.h:44
struct m0_fid gfid
Definition: dir.c:626
bool(* cago_ag_can_fini)(const struct m0_cm_aggr_group *ag)
Definition: ag.h:137
M0_INTERNAL bool m0_cm_is_locked(const struct m0_cm *cm)
Definition: cm.c:560
static bool repair_ag_can_fini(const struct m0_cm_aggr_group *ag)
Definition: ag.c:273
void m0_free(void *data)
Definition: memory.c:146
M0_INTERNAL struct m0_sns_cm_repair_ag * sag2repairag(const struct m0_sns_cm_ag *sag)
Definition: ag.c:61
static uint32_t ag_in_remaining_bufs(struct m0_sns_cm_repair_ag *rag)
Definition: ag.c:175
M0_INTERNAL struct m0_sns_cm_ag * ag2snsag(const struct m0_cm_aggr_group *ag)
Definition: ag.c:391
int32_t rc
Definition: trigger_fop.h:47
Definition: ag.h:49
M0_INTERNAL void m0_sns_cm_acc_cp_init(struct m0_sns_cm_cp *scp, struct m0_sns_cm_ag *ag)
Definition: acc_cp.c:108
static uint nr_bufs