Motr  M0
cp.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 #include "lib/memory.h" /* m0_free() */
26 #include "lib/misc.h"
27 #include "lib/finject.h" /* M0_FI_ENABLED */
28 
29 #include "cob/cob.h"
30 #include "fop/fom.h"
31 #include "ioservice/cob_foms.h" /* m0_cc_stob_cr_credit */
32 #include "ioservice/fid_convert.h" /* m0_fid_convert_cob2stob */
33 #include "reqh/reqh.h"
34 #include "stob/domain.h" /* m0_stob_domain_find_by_stob_id */
35 #include "sns/cm/cp.h"
36 #include "sns/cm/cm.h"
37 #include "sns/cm/ag.h"
38 #include "sns/cm/file.h"
39 #include "sns/cm/cm_utils.h"
40 #include "sns/cm/sns_cp_onwire.h"
41 #include "cm/proxy.h" /* m0_cm_proxy_locate */
43 #include "be/extmap.h" /* m0_be_emap_seg */
44 
51 M0_INTERNAL int m0_sns_cm_repair_cp_xform(struct m0_cm_cp *cp);
52 M0_INTERNAL int m0_sns_cm_rebalance_cp_xform(struct m0_cm_cp *cp);
53 
54 M0_INTERNAL int m0_sns_cm_repair_cp_send(struct m0_cm_cp *cp);
55 M0_INTERNAL int m0_sns_cm_rebalance_cp_send(struct m0_cm_cp *cp);
56 
57 M0_INTERNAL struct m0_sns_cm_cp *cp2snscp(const struct m0_cm_cp *cp)
58 {
59  return container_of(cp, struct m0_sns_cm_cp, sc_base);
60 }
61 
62 M0_INTERNAL bool m0_sns_cm_cp_invariant(const struct m0_cm_cp *cp)
63 {
64  struct m0_sns_cm_cp *sns_cp = cp2snscp(cp);
65 
66  return m0_fom_phase(&cp->c_fom) < M0_CCP_NR &&
68  m0_fid_is_valid(&sns_cp->sc_stob_id.si_fid) &&
70 }
71 
72 M0_INTERNAL struct m0_cm *cpfom2cm(struct m0_fom *fom)
73 {
74  return container_of(fom->fo_service, struct m0_cm, cm_service);
75 }
76 
77 /*
78  * Uses stob fid to select a request handler locality for copy packet FOM.
79  */
80 M0_INTERNAL uint64_t cp_home_loc_helper(const struct m0_cm_cp *cp)
81 {
82  struct m0_sns_cm_cp *sns_cp = cp2snscp(cp);
83  struct m0_fop *fop = cp->c_fom.fo_fop;
84  struct m0_sns_cpx *sns_cpx;
85 
86  /*
87  * Return reqh locality to be assigned to the CP FOM such that
88  * following can be serialized:
89  * - read on a particular stob, performed using CP FOM
90  * - deletion of the same stob, performed using COB FOM
91  */
92 
93  if (fop != NULL && (m0_fom_phase(&cp->c_fom) != M0_CCP_FINI)) {
94  sns_cpx = m0_fop_data(fop);
95  return m0_cob_io_fom_locality(&sns_cpx->scx_stob_id.si_fid);
96  } else
97  return m0_cob_io_fom_locality(&sns_cp->sc_cobfid);
98 }
99 
100 M0_INTERNAL int m0_sns_cm_cp_init(struct m0_cm_cp *cp)
101 {
102  struct m0_sns_cpx *sns_cpx;
103 
105 
106  if (cp->c_fom.fo_fop != NULL) {
107  struct m0_cm *cm = cpfom2cm(&cp->c_fom);
108  const char *rep = NULL;
109  struct m0_fop *fop = cp->c_fom.fo_fop;
110  struct m0_cm_proxy *cm_proxy;
111 
112  sns_cpx = m0_fop_data(cp->c_fom.fo_fop);
113  if (cp->c_cm_proxy == NULL) {
115  ->rc_destep->nep_addr;
116  m0_cm_lock(cm);
117  cm_proxy = m0_cm_proxy_locate(cm, rep);
118  M0_ASSERT(cm_proxy != NULL);
119  cp->c_cm_proxy = cm_proxy;
120  m0_cm_unlock(cm);
121  }
122  /* set local cp to the original phase */
123  m0_fom_phase_set(&cp->c_fom, sns_cpx->scx_phase);
124  }
125  return cp->c_ops->co_phase_next(cp);
126 }
127 
128 static void sns_cm_cp_stob_punch_credit(struct m0_sns_cm_cp *sns_cp,
129  struct m0_be_tx_credit *accum)
130 {
131  struct m0_indexvec got;
132  struct m0_indexvec *want = &sns_cp->sc_stio.si_stob;
133 
134  m0_indexvec_alloc(&got, 1);
135  m0_indexvec_pack(want);
136  /*
137  * @todo: Need to iterate over segments in case of more
138  * than one segment. Also todo: Need to iterate again if
139  * got count is less than want count.
140  */
141  M0_ASSERT(want->iv_vec.v_nr == 1);
142  m0_stob_punch_credit(sns_cp->sc_stob, want, &got, accum);
143  sns_cp->sc_spare_punch = want->iv_vec.v_nr == got.iv_vec.v_nr;
144 }
145 
146 M0_INTERNAL int m0_sns_cm_cp_tx_open(struct m0_cm_cp *cp)
147 {
148  struct m0_fom *fom = &cp->c_fom;
149  struct m0_dtx *dtx = &fom->fo_tx;
150  struct m0_be_tx *tx = m0_fom_tx(fom);
151  struct m0_reqh *reqh = m0_fom_reqh(fom);
152  struct m0_stob_domain *dom;
153  struct m0_be_tx_credit *cred;
154  struct m0_sns_cm_cp *sns_cp;
155 
156  /* No need to create transaction for read, its an immutable operation.*/
157  if (cp->c_io_op == M0_CM_CP_READ)
158  return 0;
159  if (dtx->tx_state == M0_DTX_INVALID) {
161  &fom->fo_loc->fl_group);
162  cred = m0_fom_tx_credit(fom);
163  sns_cp = cp2snscp(cp);
165  m0_cc_stob_cr_credit(&sns_cp->sc_stob_id, cred);
169  m0_stob_io_credit(&sns_cp->sc_stio, dom, cred);
170  sns_cm_cp_stob_punch_credit(sns_cp, cred);
171  m0_dtx_open(dtx);
172  }
173 
174  if (m0_be_tx_state(tx) == M0_BTS_FAILED)
175  return tx->t_sm.sm_rc;
176  if (M0_IN(m0_be_tx_state(tx),(M0_BTS_OPENING,
177  M0_BTS_GROUPING))) {
179  &fom->fo_cb);
180  return M0_FSO_WAIT;
181  } else
182  m0_dtx_opened(dtx);
183 
184  return 0;
185 }
186 
187 M0_INTERNAL int m0_sns_cm_cp_tx_close(struct m0_cm_cp *cp)
188 {
189  struct m0_fom *fom = &cp->c_fom;
190  struct m0_dtx *dtx = &fom->fo_tx;
191  struct m0_be_tx *tx = m0_fom_tx(fom);
192 
193  if (cp->c_io_op == M0_CM_CP_READ)
194  return 0;
195  if (dtx->tx_state == M0_DTX_INIT)
196  m0_dtx_fini(dtx);
197  if (dtx->tx_state == M0_DTX_OPEN) {
199  m0_fom_wait_on(fom, &tx->t_sm.sm_chan, &fom->fo_cb);
200  m0_dtx_done(dtx);
201  return M0_FSO_WAIT;
202  }
203  if (dtx->tx_state == M0_DTX_DONE) {
204  if (m0_be_tx_state(tx) == M0_BTS_DONE)
205  m0_dtx_fini(dtx);
206  else {
208  &fom->fo_cb);
209  return M0_FSO_WAIT;
210  }
211  }
212 
213  return 0;
214 }
215 
216 M0_INTERNAL int m0_sns_cm_cp_fail(struct m0_cm_cp *cp)
217 {
218  struct m0_sns_cm_ag *sag;
219  struct m0_pool_version *pver;
220  struct m0_cm *cm;
221  int rc;
222 
224 
226  if (rc > 0)
227  return M0_FSO_WAIT;
228  /* Move copy packet to CPP_FAIL phase on -ENOENT but do not abort, save
229  * error code in its corresponding aggregation group.
230  * Check aggregation group struct m0_cm_aggr_group::cag_rc during cleanup
231  * for copy packet failures.
232  */
233  sag = ag2snsag(cp->c_ag);
235  cp->c_rc = m0_fom_rc(&cp->c_fom);
236  cm = cp->c_ag->cag_cm;
237  if (cp->c_rc != -ENOENT) {
239  m0_cm_lock(cm);
240  m0_cm_abort(cm, cp->c_rc);
241  m0_cm_unlock(cm);
242  }
244 
245  return M0_FSO_WAIT;
246 }
247 
248 static int next[] = {
259 };
260 
261 M0_INTERNAL int m0_sns_cm_cp_phase_next(struct m0_cm_cp *cp)
262 {
263  int phase = m0_sns_cm_cp_next_phase_get(m0_fom_phase(&cp->c_fom), cp);
264 
265  M0_LOG(M0_DEBUG, "phase=%d", phase);
266 
267  m0_fom_phase_set(&cp->c_fom, phase);
268 
269  return M0_IN(phase, (M0_CCP_IO_WAIT, M0_CCP_SEND_WAIT,
272 }
273 
274 M0_INTERNAL int m0_sns_cm_cp_next_phase_get(int phase, struct m0_cm_cp *cp)
275 {
276  struct m0_sns_cm *scm;
277  struct m0_pool_version *pv;
278  struct m0_sns_cm_cp *scp = cp2snscp(cp);
279  bool local_cob;
280 
281  M0_PRE(phase >= M0_CCP_INIT && phase < M0_CCP_NR);
282 
283  if (phase == M0_CCP_IO_WAIT) {
284  if (cp->c_io_op == M0_CM_CP_WRITE)
285  return M0_CCP_FINI;
286  }
287 
288  if ((phase == M0_CCP_INIT && scp->sc_is_acc) || phase == M0_CCP_XFORM) {
290  scm = cm2sns(cp->c_ag->cag_cm);
291  local_cob = m0_sns_cm_is_local_cob(&scm->sc_base, pv,
292  &scp->sc_cobfid);
293  M0_LOG(M0_DEBUG, "cob="FID_F" local=%d",
294  FID_P(&scp->sc_cobfid), local_cob);
295  if (local_cob)
296  return M0_CCP_WRITE;
297  else
298  return M0_CCP_SW_CHECK;
299  }
300 
301  if (phase == M0_CCP_INIT && scp->sc_is_hole_eof)
302  return M0_CCP_XFORM;
303 
304  return next[phase];
305 }
306 
307 M0_INTERNAL void m0_sns_cm_cp_complete(struct m0_cm_cp *cp)
308 {
309  struct m0_sns_cm *scm;
310  struct m0_net_buffer *nbuf;
311  size_t loc_id = cp->c_fom.fo_loc->fl_idx;
312  size_t unit_size;
313 
315  M0_PRE(!cp_data_buf_tlist_is_empty(&cp->c_buffers));
316 
317  nbuf = cp_data_buf_tlist_head(&cp->c_buffers);
319  scm = cm2sns(cp->c_ag->cag_cm);
320  if (cp->c_io_op == M0_CM_CP_READ)
321  scm->sc_total_read_size[loc_id] += unit_size;
322  else
323  scm->sc_total_write_size[loc_id] += unit_size;
324 }
325 
326 M0_INTERNAL void m0_sns_cm_cp_buf_release(struct m0_cm_cp *cp)
327 {
328  struct m0_sns_cm_cp *scp = cp2snscp(cp);
329  struct m0_sns_cm *scm;
330 
331  if (!scp->sc_is_local && cp->c_ag != NULL) {
332  scm = cm2sns(cp->c_ag->cag_cm);
334  }
336 }
337 
338 M0_INTERNAL void m0_sns_cm_cp_free(struct m0_cm_cp *cp)
339 {
340  M0_PRE(cp != NULL);
341 
343  if (cp->c_ag != NULL)
344  m0_cm_ag_cp_del(cp->c_ag, cp);
345  m0_free(cp2snscp(cp));
346 }
347 
348 /*
349  * Dummy dud destructor function for struct m0_cm_cp_ops::co_action array
350  * in-order to statisfy the m0_cm_cp_invariant.
351  */
352 M0_INTERNAL int m0_sns_cm_cp_fini(struct m0_cm_cp *cp)
353 {
354  return 0;
355 }
356 
357 M0_INTERNAL void m0_sns_cm_cp_tgt_info_fill(struct m0_sns_cm_cp *scp,
358  const struct m0_fid *cob_fid,
359  uint64_t stob_offset,
360  uint64_t ag_cp_idx)
361 {
362  scp->sc_cobfid = *cob_fid;
364  scp->sc_index = stob_offset;
365  scp->sc_base.c_ag_cp_idx = ag_cp_idx;
366 }
367 
368 M0_INTERNAL int m0_sns_cm_cp_setup(struct m0_sns_cm_cp *scp,
369  const struct m0_fid *cob_fid,
370  uint64_t stob_offset,
371  uint64_t data_seg_nr,
372  uint64_t failed_unit_index,
373  uint64_t ag_cp_idx)
374 {
375  struct m0_sns_cm *scm;
376  struct m0_net_buffer_pool *bp;
377 
378  M0_PRE(scp != NULL && scp->sc_base.c_ag != NULL);
379 
381  scp->sc_base.c_data_seg_nr = data_seg_nr;
382  scp->sc_failed_idx = failed_unit_index;
383  m0_sns_cm_cp_tgt_info_fill(scp, cob_fid, stob_offset, ag_cp_idx);
386 
387  /*
388  * Set the bit value of own index if it is not an accumulator copy
389  * packet.
390  */
391  if (ag_cp_idx < scp->sc_base.c_ag->cag_cp_global_nr)
393  true);
394 
396 
397  return m0_sns_cm_buf_attach(bp, &scp->sc_base);
398 }
399 
400 M0_INTERNAL int m0_sns_cm_cp_dup(struct m0_cm_cp *src, struct m0_cm_cp **dest)
401 {
402  struct m0_sns_cm_cp *dest_scp;
403  struct m0_sns_cm_cp *src_scp;
404  int rc;
405 
406  rc = m0_cm_cp_dup(src, dest);
407  if (rc == 0) {
408  dest_scp = cp2snscp(*dest);
409  src_scp = cp2snscp(src);
410  dest_scp->sc_is_acc = true;
411  dest_scp->sc_cobfid = src_scp->sc_cobfid;
412  dest_scp->sc_stob_id = src_scp->sc_stob_id;
413  dest_scp->sc_is_local = src_scp->sc_is_local;
414  dest_scp->sc_failed_idx = src_scp->sc_failed_idx;
415  dest_scp->sc_index = src_scp->sc_index;
416  }
417 
418  return M0_RC(rc);
419 }
420 
422  .co_action = {
435  /* To satisfy the m0_cm_cp_invariant() */
437  },
438  .co_action_nr = M0_CCP_NR,
439  .co_phase_next = &m0_sns_cm_cp_phase_next,
440  .co_invariant = &m0_sns_cm_cp_invariant,
441  .co_home_loc_helper = &cp_home_loc_helper,
442  .co_complete = &m0_sns_cm_cp_complete,
443  .co_free = &m0_sns_cm_cp_free,
444 };
445 
447  .co_action = {
460  /* To satisfy the m0_cm_cp_invariant() */
462  },
463  .co_action_nr = M0_CCP_NR,
464  .co_phase_next = &m0_sns_cm_cp_phase_next,
465  .co_invariant = &m0_sns_cm_cp_invariant,
466  .co_home_loc_helper = &cp_home_loc_helper,
467  .co_complete = &m0_sns_cm_cp_complete,
468  .co_free = &m0_sns_cm_cp_free,
469 };
470 
473 #undef M0_TRACE_SUBSYSTEM
474 
475 /*
476  * Local variables:
477  * c-indentation-style: "K&R"
478  * c-basic-offset: 8
479  * tab-width: 8
480  * fill-column: 80
481  * scroll-step: 1
482  * End:
483  */
M0_INTERNAL void m0_sns_cm_pver_dirty_set(struct m0_pool_version *pver)
Definition: cm_utils.c:580
M0_INTERNAL void m0_cm_cp_buf_release(struct m0_cm_cp *cp)
Definition: cp.c:713
Definition: cm.h:205
M0_INTERNAL void m0_sns_cm_cp_free(struct m0_cm_cp *cp)
Definition: cp.c:338
M0_INTERNAL int m0_sns_cm_cp_init(struct m0_cm_cp *cp)
Definition: cp.c:100
struct m0_be_domain * bs_domain
Definition: seg.h:82
M0_INTERNAL void m0_cm_lock(struct m0_cm *cm)
Definition: cm.c:545
#define M0_PRE(cond)
Definition: dtm.h:554
M0_INTERNAL int m0_bitmap_init(struct m0_bitmap *map, size_t nr)
Definition: bitmap.c:86
M0_INTERNAL void m0_cm_ag_cp_del(struct m0_cm_aggr_group *ag, struct m0_cm_cp *cp)
Definition: ag.c:520
struct m0_net_buffer_pool * nb_pool
Definition: net.h:1508
M0_INTERNAL void m0_sns_cm_cp_tgt_info_fill(struct m0_sns_cm_cp *scp, const struct m0_fid *cob_fid, uint64_t stob_offset, uint64_t ag_cp_idx)
Definition: cp.c:357
M0_INTERNAL int m0_indexvec_alloc(struct m0_indexvec *ivec, uint32_t len)
Definition: vec.c:532
struct m0_fop * fo_fop
Definition: fom.h:490
struct m0_sns_cm_buf_pool sc_obp
Definition: cm.h:240
#define NULL
Definition: misc.h:38
M0_INTERNAL int m0_sns_cm_cp_send_wait(struct m0_cm_cp *cp)
Definition: net.c:297
struct m0_stob_id scx_stob_id
Definition: sns_cp_onwire.h:47
struct m0_bitmap c_xform_cp_indices
Definition: cp.h:181
struct m0_stob_id sc_stob_id
Definition: cp.h:45
struct m0_fid si_domain_fid
Definition: stob.h:103
M0_INTERNAL struct m0_sns_cm * cm2sns(struct m0_cm *cm)
Definition: cm.c:389
#define ergo(a, b)
Definition: misc.h:293
M0_INTERNAL void m0_stob_io_credit(const struct m0_stob_io *io, const struct m0_stob_domain *dom, struct m0_be_tx_credit *accum)
Definition: io.c:130
M0_INTERNAL struct m0_cob_domain * m0_sns_cm_cp2cdom(struct m0_cm_cp *cp)
Definition: storage.c:189
m0_bcount_t nbp_seg_size
Definition: buffer_pool.h:255
m0_be_tx_state
Definition: tx.h:214
struct m0_pool_version * pm_pver
Definition: pool_machine.h:172
static void sns_cm_cp_stob_punch_credit(struct m0_sns_cm_cp *sns_cp, struct m0_be_tx_credit *accum)
Definition: cp.c:128
struct m0_pool_version * pv
Definition: dir.c:629
#define M0_LOG(level,...)
Definition: trace.h:167
Definition: cp.h:160
static struct m0_be_tx_credit * m0_fom_tx_credit(struct m0_fom *fom)
Definition: fom.h:542
M0_INTERNAL int m0_sns_cm_cp_recv_wait(struct m0_cm_cp *cp)
Definition: net.c:512
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 void m0_dtx_init(struct m0_dtx *tx, struct m0_be_domain *be_domain, struct m0_sm_group *sm_group)
Definition: dtm.c:67
M0_INTERNAL void m0_dtx_opened(struct m0_dtx *tx)
Definition: dtm.c:94
int fl_idx
Definition: fom.h:296
M0_INTERNAL void m0_sns_cm_cp_complete(struct m0_cm_cp *cp)
Definition: cp.c:307
static struct m0_sns_cm * scm
Definition: cm.c:64
void * m0_fop_data(const struct m0_fop *fop)
Definition: fop.c:220
M0_INTERNAL void m0_fom_wait_on(struct m0_fom *fom, struct m0_chan *chan, struct m0_fom_callback *cb)
Definition: fom.c:1490
uint64_t c_ag_cp_idx
Definition: cp.h:175
struct m0_sns_cm_buf_pool sc_ibp
Definition: cm.h:227
const char * nep_addr
Definition: net.h:503
#define container_of(ptr, type, member)
Definition: misc.h:33
struct m0_poolmach * sf_pm
Definition: file.h:70
M0_INTERNAL int m0_sns_cm_buf_attach(struct m0_net_buffer_pool *bp, struct m0_cm_cp *cp)
Definition: cm.c:810
struct m0_fop_getxattr_rep * rep
Definition: dir.c:455
struct m0_rpc_chan * c_rpcchan
Definition: conn.h:317
struct m0_stob * sc_stob
Definition: cp.h:66
m0_fom_phase
Definition: fom.h:372
static struct m0_be_tx * m0_fom_tx(struct m0_fom *fom)
Definition: fom.h:537
uint64_t cag_cp_global_nr
Definition: ag.h:86
M0_INTERNAL int m0_sns_cm_cp_write_pre(struct m0_cm_cp *cp)
Definition: storage.c:330
struct m0_vec iv_vec
Definition: vec.h:139
return M0_RC(rc)
static struct m0_cm * cm
Definition: cm.c:63
M0_INTERNAL void m0_cob_tx_credit(struct m0_cob_domain *dom, enum m0_cob_op optype, struct m0_be_tx_credit *accum)
Definition: cob.c:2281
M0_INTERNAL int m0_cm_cp_dup(struct m0_cm_cp *src, struct m0_cm_cp **dest)
Definition: cp.c:805
M0_INTERNAL void m0_cm_unlock(struct m0_cm *cm)
Definition: cm.c:550
static uint32_t unit_size
Definition: layout.c:53
Definition: cp.h:151
struct m0_fid sc_cobfid
Definition: cp.h:42
const struct m0_cm_cp_ops m0_sns_cm_repair_cp_ops
Definition: cp.c:421
static struct m0_sns_cm_ag * sag
Definition: cm.c:66
struct m0_cm_cp sc_base
Definition: cp.h:39
enum m0_cm_cp_io_op c_io_op
Definition: cp.h:196
M0_INTERNAL int m0_sns_cm_cp_recv_init(struct m0_cm_cp *cp)
Definition: net.c:432
M0_INTERNAL void m0_dtx_open(struct m0_dtx *tx)
Definition: dtm.c:86
struct m0_indexvec si_stob
Definition: io.h:311
#define M0_ASSERT(cond)
M0_INTERNAL int m0_sns_cm_cp_write(struct m0_cm_cp *cp)
Definition: storage.c:335
M0_INTERNAL struct m0_pool_version * m0_sns_cm_pool_version_get(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:686
int c_rc
Definition: cp.h:218
struct m0_fid pver
Definition: idx_dix.c:74
uint32_t c_data_seg_nr
Definition: cp.h:190
struct m0_stob_io sc_stio
Definition: cp.h:63
M0_INTERNAL int m0_sns_cm_cp_io_wait(struct m0_cm_cp *cp)
Definition: storage.c:341
void m0_fom_phase_move(struct m0_fom *fom, int32_t rc, int phase)
Definition: fom.c:1699
M0_INTERNAL int m0_sns_cm_cp_phase_next(struct m0_cm_cp *cp)
Definition: cp.c:261
M0_INTERNAL void m0_fid_convert_cob2stob(const struct m0_fid *cob_fid, struct m0_stob_id *stob_id)
Definition: fid_convert.c:141
struct m0_cm * cag_cm
Definition: ag.h:70
m0_bindex_t sc_index
Definition: cp.h:60
M0_INTERNAL int m0_sns_cm_cp_dup(struct m0_cm_cp *src, struct m0_cm_cp **dest)
Definition: cp.c:400
const struct m0_cm_cp_ops m0_sns_cm_rebalance_cp_ops
Definition: cp.c:446
static struct m0_stob_domain * dom
Definition: storage.c:38
const struct m0_cm_cp_ops * c_ops
Definition: cp.h:169
static int next[]
Definition: cp.c:248
static struct m0_fid cob_fid
Definition: net.c:116
M0_INTERNAL int m0_sns_cm_cp_setup(struct m0_sns_cm_cp *scp, const struct m0_fid *cob_fid, uint64_t stob_offset, uint64_t data_seg_nr, uint64_t failed_unit_index, uint64_t ag_cp_idx)
Definition: cp.c:368
struct m0_fid si_fid
Definition: stob.h:105
struct m0_net_end_point * rc_destep
M0_INTERNAL bool m0_sns_cm_cp_invariant(const struct m0_cm_cp *cp)
Definition: cp.c:62
int(* co_action[])(struct m0_cm_cp *cp)
Definition: cp.h:259
M0_INTERNAL struct m0_cm * cpfom2cm(struct m0_fom *fom)
Definition: cp.c:72
M0_INTERNAL void m0_dtx_fini(struct m0_dtx *tx)
Definition: dtm.c:134
Definition: reqh.h:94
M0_INTERNAL void m0_bitmap_set(struct m0_bitmap *map, size_t idx, bool val)
Definition: bitmap.c:139
uint32_t v_nr
Definition: vec.h:51
int32_t sm_rc
Definition: sm.h:336
Definition: dump.c:103
struct m0_cm_aggr_group * c_ag
Definition: cp.h:172
uint64_t sc_failed_idx
Definition: cp.h:55
M0_INTERNAL struct m0_sns_cm_cp * cp2snscp(const struct m0_cm_cp *cp)
Definition: cp.c:57
M0_INTERNAL void m0_dtx_done(struct m0_dtx *tx)
Definition: dtm.c:115
M0_INTERNAL int m0_sns_cm_rebalance_cp_xform(struct m0_cm_cp *cp)
Definition: xform.c:50
struct m0_sm t_sm
Definition: tx.h:281
#define FID_P(f)
Definition: fid.h:77
M0_INTERNAL int m0_sns_cm_cp_tx_open(struct m0_cm_cp *cp)
Definition: cp.c:146
M0_INTERNAL struct m0_stob_domain * m0_stob_domain_find_by_stob_id(const struct m0_stob_id *stob_id)
Definition: domain.c:294
bool sc_is_hole_eof
Definition: cp.h:80
bool sc_spare_punch
Definition: cp.h:78
M0_INTERNAL uint32_t m0_indexvec_pack(struct m0_indexvec *iv)
Definition: vec.c:521
M0_INTERNAL int m0_stob_punch_credit(struct m0_stob *stob, struct m0_indexvec *want, struct m0_indexvec *got, struct m0_be_tx_credit *accum)
Definition: stob.c:223
Definition: fom.h:481
struct m0_sns_cm_file_ctx * sag_fctx
Definition: ag.h:48
uint32_t c_buf_nr
Definition: cp.h:187
struct m0_reqh reqh
Definition: rm_foms.c:48
struct m0_cm_proxy * c_cm_proxy
Definition: cp.h:208
M0_INTERNAL int m0_sns_cm_cp_read(struct m0_cm_cp *cp)
Definition: storage.c:324
struct m0_net_buffer_pool sb_bp
Definition: cm.h:135
M0_INTERNAL int m0_sns_cm_repair_cp_send(struct m0_cm_cp *cp)
Definition: net.c:37
Definition: fid.h:38
struct m0_fom_locality * fo_loc
Definition: fom.h:483
static struct m0_sns_cm_cp scp
Definition: cm.c:65
M0_INTERNAL size_t m0_cob_io_fom_locality(const struct m0_fid *fid)
Definition: cob_foms.c:271
struct m0_chan sm_chan
Definition: sm.h:331
struct m0_reqh_service cm_service
Definition: cm.h:191
bool sc_is_local
Definition: cp.h:53
struct m0_rpc_session * ri_session
Definition: item.h:147
size_t * sc_total_read_size
Definition: cm.h:259
Definition: cm.h:166
M0_INTERNAL int m0_fom_rc(const struct m0_fom *fom)
Definition: fom.c:1727
M0_INTERNAL int m0_sns_cm_rebalance_cp_send(struct m0_cm_cp *cp)
Definition: net.c:37
M0_INTERNAL struct m0_cm_proxy * m0_cm_proxy_locate(struct m0_cm *cm, const char *addr)
Definition: proxy.c:161
enum m0_dtx_state tx_state
Definition: dtm.h:558
M0_INTERNAL int m0_cc_stob_cr_credit(struct m0_stob_id *sid, struct m0_be_tx_credit *accum)
Definition: cob_foms.c:807
static struct m0_fop * fop
Definition: item.c:57
M0_INTERNAL int m0_sns_cm_cp_fail(struct m0_cm_cp *cp)
Definition: cp.c:216
int(* co_phase_next)(struct m0_cm_cp *cp)
Definition: cp.h:232
M0_INTERNAL void m0_sns_cm_cancel_reservation(struct m0_sns_cm *scm, size_t nr_bufs)
Definition: cm.c:926
struct m0_be_seg * rh_beseg
Definition: reqh.h:112
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
struct m0_cm sc_base
Definition: cm.h:206
static struct bulkio_params * bp
Definition: bulkio_ut.c:44
M0_INTERNAL int m0_sns_cm_cp_tx_close(struct m0_cm_cp *cp)
Definition: cp.c:187
M0_INTERNAL int m0_sns_cm_cp_sw_check(struct m0_cm_cp *cp)
Definition: net.c:541
void m0_fom_phase_set(struct m0_fom *fom, int phase)
Definition: fom.c:1688
struct m0_fom c_fom
Definition: cp.h:161
M0_INTERNAL void m0_cm_abort(struct m0_cm *cm, int rc)
Definition: cm.c:1181
bool sc_is_acc
Definition: cp.h:57
M0_INTERNAL bool m0_fid_is_valid(const struct m0_fid *fid)
Definition: fid.c:96
M0_INTERNAL uint64_t cp_home_loc_helper(const struct m0_cm_cp *cp)
Definition: cp.c:80
uint32_t scx_phase
Definition: sns_cp_onwire.h:52
void m0_free(void *data)
Definition: memory.c:146
M0_INTERNAL int m0_sns_cm_repair_cp_xform(struct m0_cm_cp *cp)
Definition: xform.c:222
struct m0_rpc_item f_item
Definition: fop.h:83
M0_INTERNAL bool m0_cm_cp_invariant(const struct m0_cm_cp *cp)
Definition: cp.c:587
struct m0_pdclust_src_addr src
Definition: fd.c:108
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
struct m0_rpc_conn * s_conn
Definition: session.h:312
Definition: fop.h:79
M0_INTERNAL int m0_sns_cm_cp_fini(struct m0_cm_cp *cp)
Definition: cp.c:352
#define FID_F
Definition: fid.h:75
M0_INTERNAL struct m0_reqh * m0_fom_reqh(const struct m0_fom *fom)
Definition: fom.c:283
Definition: tx.h:280
size_t * sc_total_write_size
Definition: cm.h:260
M0_INTERNAL int m0_sns_cm_cp_next_phase_get(int phase, struct m0_cm_cp *cp)
Definition: cp.c:274