Motr  M0
cp.c
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2017-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_DIXCM
24 #include "lib/trace.h"
25 #include "lib/memory.h" /* m0_free() */
26 #include "lib/misc.h"
27 
28 #include "fop/fom.h"
29 #include "reqh/reqh.h"
30 #include "dix/cm/cp.h"
31 #include "dix/cm/cm.h"
32 #include "dix/cm/dix_cp_onwire.h"
33 #include "dix/fid_convert.h"
34 
42 
43 M0_INTERNAL int m0_dix_cm_cp_sw_check(struct m0_cm_cp *cp);
44 M0_INTERNAL int m0_dix_cm_cp_send_wait(struct m0_cm_cp *cp);
45 
46 M0_INTERNAL int m0_dix_cm_repair_cp_send(struct m0_cm_cp *cp);
47 M0_INTERNAL int m0_dix_cm_rebalance_cp_send(struct m0_cm_cp *cp);
48 
49 
50 M0_INTERNAL struct m0_dix_cm_cp *cp2dixcp(const struct m0_cm_cp *cp)
51 {
52  return container_of(cp, struct m0_dix_cm_cp, dc_base);
53 }
54 
55 static struct m0_dix_cm *cp2dixcm(struct m0_cm_cp *cp)
56 {
57  struct m0_cm *cm = M0_AMB(cm, cp->c_fom.fo_service, cm_service);
58 
59  return cm2dix(cm);
60 }
61 
62 M0_INTERNAL bool m0_dix_cm_cp_invariant(const struct m0_cm_cp *cp)
63 {
64  struct m0_dix_cm_cp *dix_cp = cp2dixcp(cp);
65 
66  return m0_fom_phase(&cp->c_fom) < M0_CCP_NR &&
68  m0_fid_is_valid(&dix_cp->dc_ctg_fid));
69 }
70 
74 M0_INTERNAL uint64_t m0_dix_cm_cp_home_loc_helper(const struct m0_cm_cp *cp)
75 {
76  struct m0_dix_cm_cp *dix_cp = cp2dixcp(cp);
77  struct m0_fop *fop = cp->c_fom.fo_fop;
78  struct m0_dix_cpx *dix_cpx = NULL;
79 
81 
82  if (fop != NULL)
83  dix_cpx = m0_fop_data(fop);
84 
85  return m0_dix_fid_cctg_device_id(dix_cpx != NULL ?
86  &dix_cpx->dcx_ctg_fid :
87  &dix_cp->dc_ctg_fid);
88 }
89 
90 M0_INTERNAL struct m0_cm_cp *m0_dix_cm_cp_alloc(struct m0_cm *cm)
91 {
92  struct m0_dix_cm_cp *dcp;
93 
94  M0_ALLOC_PTR(dcp);
95  if (dcp == NULL)
96  return NULL;
97  return &dcp->dc_base;
98 }
99 
100 static void dix_cm_cp_dtx_fini(struct m0_cm_cp *cp)
101 {
102  struct m0_fom *fom = &cp->c_fom;
103 
104  m0_dtx_fini(&fom->fo_tx);
106 }
107 
108 static int dix_cm_cp_dtx_failure(struct m0_cm_cp *cp)
109 {
110  struct m0_fom *fom = &cp->c_fom;
111  struct m0_be_tx *tx = m0_fom_tx(fom);
112 
113  dix_cm_cp_dtx_fini(cp);
114  return tx->t_sm.sm_rc;
115 }
116 
117 static int dix_cm_cp_incoming_kv(struct m0_rpc_at_buf *ab_key,
118  struct m0_rpc_at_buf *ab_val,
119  struct m0_buf *key,
120  struct m0_buf *val)
121 {
122  int rc;
123 
124  M0_PRE(m0_rpc_at_is_set(ab_key));
125  M0_PRE(m0_rpc_at_is_set(ab_val));
126  rc = m0_rpc_at_get(ab_key, key);
127  if (rc != 0)
128  return M0_ERR(rc);
129  rc = m0_rpc_at_get(ab_val, val);
130  return M0_RC(rc);
131 }
132 
136 static void dixcpx_to_dixcp(const struct m0_dix_cpx *dix_cpx,
137  struct m0_dix_cm_cp *dix_cp)
138 {
139  M0_PRE(dix_cp != NULL);
140  M0_PRE(dix_cpx != NULL);
141 
142  dix_cp->dc_ctg_fid = dix_cpx->dcx_ctg_fid;
143  dix_cp->dc_ctg_op_flags = dix_cpx->dcx_ctg_op_flags;
144 
145  dix_cp->dc_base.c_prio = dix_cpx->dcx_cp.cpx_prio;
146 
148 
149  dix_cp->dc_is_local = false;
150 
151  dix_cp->dc_base.c_buf_nr = 0;
152  dix_cp->dc_base.c_data_seg_nr = 0;
153 }
154 
155 static void dix_cm_cp_reply_send(struct m0_cm_cp *cp,
156  struct m0_fop_type *ft,
157  int rc)
158 {
159  struct m0_fop *rfop = cp->c_fom.fo_rep_fop;
160  struct m0_cpx_reply *cpx_rep;
161 
162  M0_ENTRY("cm: %p, cp: %p, ft:'%s', rc: %d",
163  cpfom2cm(&cp2dixcp(cp)->dc_base.c_fom), cp, ft->ft_name, rc);
164  cpx_rep = m0_fop_data(cp->c_fom.fo_fop);
165  cpx_rep->cr_rc = rc;
166  m0_rpc_reply_post(&cp->c_fom.fo_fop->f_item, &rfop->f_item);
167 }
168 
169 static int dix_cm_fom_tx_wait(struct m0_fom *fom)
170 {
171  m0_fom_wait_on(fom, &m0_fom_tx(fom)->t_sm.sm_chan, &fom->fo_cb);
172  return M0_FSO_WAIT;
173 }
174 
175 M0_INTERNAL int m0_dix_cm_cp_init(struct m0_cm_cp *cp)
176 {
177  struct m0_dix_cpx *dix_cpx = NULL;
178  int next_phase;
179  int rc = 0;
180 
181  M0_ENTRY();
183 
184  if (cp->c_fom.fo_fop != NULL) {
185  struct m0_dix_cm_cp *dix_cp = cp2dixcp(cp);
186  struct m0_cm_aggr_group *ag;
187  struct m0_cm *cm;
188 
189  dix_cpx = m0_fop_data(cp->c_fom.fo_fop);
190  dixcpx_to_dixcp(dix_cpx, dix_cp);
191 
192  /*
193  * Setup dummy aggregation group and add copy packet here,
194  * generic mechanism needs it.
195  */
196  cm = cpfom2cm(&dix_cp->dc_base.c_fom);
197  m0_cm_lock(cm);
199  true, &ag);
200  m0_cm_unlock(cm);
201 
202  if (rc == 0) {
203  m0_cm_ag_cp_add(ag, &dix_cp->dc_base);
204 
205  dix_cp->dc_phase_transmit = DCM_PT_KEY;
206  dix_cp->dc_ctg = NULL;
208  &cp->c_fom,
209  &dix_cp->dc_meta_lock_addb2);
211  &dix_cp->dc_ctg_lock_addb2);
212  m0_fom_phase_set(&cp->c_fom, dix_cpx->dcx_phase);
213  }
214  }
215 
216  if (rc == 0) {
217  M0_ASSERT(M0_IN(m0_fom_phase(&cp->c_fom),
219  if (m0_fom_phase(&cp->c_fom) == M0_CCP_INIT)
220  next_phase = M0_CCP_SEND;
221  else
222  next_phase = M0_CCP_RECV_INIT;
223  } else
224  next_phase = M0_CCP_FAIL;
225  m0_fom_phase_set(&cp->c_fom, next_phase);
226  M0_LOG(M0_DEBUG, "Next phase is: %d", next_phase);
227  return M0_RC(M0_FSO_AGAIN);
228 }
229 
230 M0_INTERNAL int m0_dix_cm_cp_fail(struct m0_cm_cp *cp,
231  struct m0_fop_type *ft)
232 {
233  struct m0_dix_cm_cp *dix_cp = cp2dixcp(cp);
234  struct m0_cas_ctg *meta = m0_ctg_meta();
235 
236  M0_ENTRY("cp: %p, ft: %s", cp, ft->ft_name);
238 
239  m0_long_unlock(m0_ctg_lock(meta), &dix_cp->dc_meta_lock);
240  if (dix_cp->dc_ctg != NULL)
241  m0_long_unlock(m0_ctg_lock(dix_cp->dc_ctg), &dix_cp->dc_ctg_lock);
242  cp->c_rc = m0_fom_rc(&cp->c_fom);
243  dix_cm_cp_reply_send(cp, ft, cp->c_rc);
245  M0_LEAVE("ret %d, cp_rc %d", M0_FSO_WAIT, cp->c_rc);
246  return M0_RC(M0_FSO_WAIT);
247 }
248 
249 static int dix_cm_repair_cp_fail(struct m0_cm_cp *cp)
250 {
252 }
253 
254 static int dix_cm_rebalance_cp_fail(struct m0_cm_cp *cp)
255 {
257 }
258 
259 M0_INTERNAL void m0_dix_cm_cp_complete(struct m0_cm_cp *cp)
260 {
261  struct m0_dix_cm *dcm = cp2dixcm(cp);
262  struct m0_dix_cm_cp *dix_cp = cp2dixcp(cp);
263  struct m0_dix_cm_stats *dcs = m0_locality_data(dcm->dcm_stats_key);
264  size_t size;
265 
267 
268  /* Collect stats for the current locality. */
269  size = dix_cp->dc_key.b_nob + dix_cp->dc_val.b_nob;
270  if (cp->c_io_op == M0_CM_CP_READ)
271  dcs->dcs_read_size += size;
272  else
273  dcs->dcs_write_size += size;
274  M0_LEAVE("io_op %d, size %ld", cp->c_io_op, size);
275 }
276 
277 M0_INTERNAL void m0_dix_cm_cp_free(struct m0_cm_cp *cp)
278 {
279  struct m0_dix_cm_cp *dix_cp = cp2dixcp(cp);
280 
281  if (cp->c_ag != NULL)
282  m0_cm_ag_cp_del(cp->c_ag, cp);
283  m0_free(dix_cp);
284 }
285 
286 M0_INTERNAL int m0_dix_cm_cp_fini(struct m0_cm_cp *cp)
287 {
288  struct m0_dix_cm_cp *dix_cp = cp2dixcp(cp);
289  struct m0_dix_cm *dcm = cp2dixcm(cp);
290  struct m0_cm_cp_pump *pump = &dcm->dcm_base.cm_cp_pump;
291 
292  M0_ENTRY();
293  if (dix_cp->dc_is_local) {
295  dcm->dcm_cp_in_progress = false;
296  m0_fom_wakeup(&pump->p_fom);
297  } else {
300  }
301  return M0_RC(0);
302 }
303 
304 M0_INTERNAL void m0_dix_cm_cp_tgt_info_fill(struct m0_dix_cm_cp *dix_cp,
305  const struct m0_fid *cctg_fid)
306 {
307  dix_cp->dc_ctg_fid = *cctg_fid;
308 }
309 
310 M0_INTERNAL void m0_dix_cm_cp_setup(struct m0_dix_cm_cp *dix_cp,
311  const struct m0_fid *cctg_fid,
312  uint64_t failed_unit_index)
313 {
314  M0_PRE(dix_cp != NULL && dix_cp->dc_base.c_ag != NULL);
315 
316  m0_dix_cm_cp_tgt_info_fill(dix_cp, cctg_fid);
318 }
319 
320 M0_INTERNAL int m0_dix_cm_cp_dup(struct m0_cm_cp *src, struct m0_cm_cp **dest)
321 {
322  struct m0_dix_cm_cp *dest_dix_cp;
323  struct m0_dix_cm_cp *src_dix_cp;
324  int rc;
325 
326  M0_ENTRY();
327  rc = m0_cm_cp_dup(src, dest);
328  if (rc == 0) {
329  dest_dix_cp = cp2dixcp(*dest);
330  src_dix_cp = cp2dixcp(src);
331  dest_dix_cp->dc_ctg_fid = src_dix_cp->dc_ctg_fid;
332  dest_dix_cp->dc_is_local = src_dix_cp->dc_is_local;
333  }
334  return M0_RC(rc);
335 }
336 
337 M0_INTERNAL int m0_dix_cm_cp_read(struct m0_cm_cp *cp)
338 {
339  /* All data are already read by DIX iterator. */
340  M0_ENTRY();
342  M0_LOG(M0_DEBUG, "set next state to %d", M0_CCP_IO_WAIT);
343  return M0_RC(M0_FSO_AGAIN);
344 }
345 
346 M0_INTERNAL int m0_dix_cm_cp_xform(struct m0_cm_cp *cp)
347 {
348  struct m0_dix_cm_cp *dix_cp = cp2dixcp(cp);
349 
350  M0_ENTRY();
351  m0_ctg_op_init(&dix_cp->dc_ctg_op, &cp->c_fom, 0);
352  return M0_RC(m0_ctg_meta_lookup(&dix_cp->dc_ctg_op,
353  &dix_cp->dc_ctg_fid,
355 }
356 
357 M0_INTERNAL int m0_dix_cm_cp_write_pre(struct m0_cm_cp *cp)
358 {
359  struct m0_dix_cm_cp *dix_cp = cp2dixcp(cp);
360  struct m0_dix_cpx *dix_cpx = m0_fop_data(cp->c_fom.fo_fop);
361  struct m0_ctg_op *ctg_op = &dix_cp->dc_ctg_op;
362  int result = M0_FSO_AGAIN;
363  int rc;
364 
365  M0_ENTRY("cp: %p", cp);
366 
367  rc = m0_ctg_op_rc(ctg_op);
368  if (rc == 0)
369  rc = dix_cm_cp_incoming_kv(&dix_cpx->dcx_ab_key,
370  &dix_cpx->dcx_ab_val,
371  &dix_cp->dc_key,
372  &dix_cp->dc_val);
373  if (rc == 0) {
374  struct m0_cas_ctg *meta = m0_ctg_meta();
375 
376  dix_cp->dc_ctg = m0_ctg_meta_lookup_result(ctg_op);
377  M0_ASSERT(dix_cp->dc_ctg != NULL);
379  &dix_cp->dc_meta_lock);
380  result = m0_long_write_lock(m0_ctg_lock(dix_cp->dc_ctg),
381  &dix_cp->dc_ctg_lock,
383  result = M0_FOM_LONG_LOCK_RETURN(result);
384  } else {
385  M0_LOG(M0_DEBUG, "ctg_op_rc %d move to state %d (fail)",
386  rc, M0_CCP_FAIL);
388  }
389  m0_ctg_op_fini(ctg_op);
390  return M0_RC(result);
391 }
392 
393 M0_INTERNAL int m0_dix_cm_cp_tx_open(struct m0_cm_cp *cp)
394 {
395  struct m0_fom *fom = &cp->c_fom;
396  struct m0_dix_cm_cp *dix_cp = cp2dixcp(cp);
397  struct m0_be_tx_credit *accum = &fom->fo_tx.tx_betx_cred;
398 
399  dix_cp->dc_ctg_op_rc = 0;
400  m0_dtx_init(&fom->fo_tx, m0_fom_reqh(fom)->rh_beseg->bs_domain,
401  &fom->fo_loc->fl_group);
402 
403  m0_ctg_insert_credit(dix_cp->dc_ctg, dix_cp->dc_key.b_nob,
404  dix_cp->dc_val.b_nob, accum);
405 
406  m0_dtx_open(&fom->fo_tx);
407 
409 
410  return dix_cm_fom_tx_wait(fom);
411 }
412 
413 M0_INTERNAL int m0_dix_cm_cp_write(struct m0_cm_cp *cp)
414 {
415  struct m0_fom *fom = &cp->c_fom;
416  struct m0_dix_cm_cp *dix_cp = cp2dixcp(cp);
417  struct m0_dix_cm *dix_cm = cp2dixcm(cp);
418  bool repair = dix_cm->dcm_type ==
420  struct m0_ctg_op *ctg_op = &dix_cp->dc_ctg_op;
421  struct m0_be_tx *tx;
422  int result = M0_FSO_AGAIN;
423  int rc = 0;
424 
425  M0_ENTRY("cp: %p", cp);
426 
427  tx = m0_fom_tx(fom);
428  if (m0_be_tx_state(tx) != M0_BTS_ACTIVE) {
429  if (m0_be_tx_state(tx) == M0_BTS_FAILED)
431  else {
432  result = dix_cm_fom_tx_wait(fom);
433  }
434  } else {
435  m0_dtx_opened(&fom->fo_tx);
436  m0_ctg_op_init(ctg_op, &cp->c_fom,
437  (dix_cp->dc_ctg_op_flags |
438  (repair ? COF_RESERVE : 0)));
439  cp->c_io_op = M0_CM_CP_WRITE;
440  result = m0_ctg_insert(ctg_op, dix_cp->dc_ctg,
441  &dix_cp->dc_key,
442  &dix_cp->dc_val,
444  if (result < 0)
445  rc = result;
446  }
447  if (rc != 0)
449  return M0_RC(result);
450 }
451 
452 M0_INTERNAL int m0_dix_cm_cp_tx_done(struct m0_cm_cp *cp)
453 {
454  struct m0_fom *fom = &cp->c_fom;
455  struct m0_be_tx *tx = m0_fom_tx(fom);
456  struct m0_dix_cm_cp *dix_cp = cp2dixcp(cp);
457  struct m0_ctg_op *ctg_op = &dix_cp->dc_ctg_op;
458  int result = M0_FSO_AGAIN;
459  int rc = 0;
460 
461  M0_ENTRY("cp=%p, rc %d", cp, m0_ctg_op_rc(ctg_op));
462 
463  dix_cp->dc_ctg_op_rc = m0_ctg_op_rc(ctg_op);
464  m0_ctg_op_fini(ctg_op);
465  if (m0_be_tx_state(tx) == M0_BTS_FAILED) {
466  /* @todo: Can not finalise here in active state. */
467  fom->fo_tx.tx_state = M0_DTX_DONE;
469  } else {
470  m0_dtx_done(&fom->fo_tx);
472  result = dix_cm_fom_tx_wait(fom);
473  }
474  if (rc != 0)
476  return result;
477 }
478 
479 M0_INTERNAL int m0_dix_cm_cp_io_wait(struct m0_cm_cp *cp,
480  struct m0_fop_type *ft)
481 {
482  struct m0_fom *fom = &cp->c_fom;
483  struct m0_be_tx *tx = m0_fom_tx(fom);
484  struct m0_dix_cm_cp *dix_cp = cp2dixcp(cp);
485  int result = M0_FSO_AGAIN;
486  int rc = 0;
487 
488  M0_ENTRY("cp=%p, ft '%s'", cp, ft->ft_name);
489 
490  if (m0_be_tx_state(tx) != M0_BTS_DONE) {
491  if (m0_be_tx_state(tx) == M0_BTS_FAILED)
493  else
494  result = dix_cm_fom_tx_wait(fom);
495  } else {
496  rc = dix_cp->dc_ctg_op_rc;
497  dix_cm_cp_reply_send(cp, ft, rc);
498  dix_cm_cp_dtx_fini(cp);
499  if (rc == 0) {
500  cp->c_ops->co_complete(cp);
502  &dix_cp->dc_ctg_lock);
503  M0_LOG(M0_DEBUG, "move to next state CPP_FINI");
505  result = M0_FSO_WAIT;
506  }
507  }
508  if (rc != 0) {
509  M0_LOG(M0_DEBUG, "move to next state CPP_FAIL");
511  }
512  return result;
513 }
514 
515 static int dix_cm_repair_cp_io_wait(struct m0_cm_cp *cp)
516 {
518 }
519 
520 static int dix_cm_rebalance_cp_io_wait(struct m0_cm_cp *cp)
521 {
523 }
524 
525 M0_INTERNAL const struct m0_cm_cp_ops m0_dix_cm_repair_cp_ops = {
526  .co_action = {
542  },
543  .co_action_nr = M0_CCP_NR,
544  .co_phase_next = NULL,
545  .co_invariant = &m0_dix_cm_cp_invariant,
546  .co_home_loc_helper = &m0_dix_cm_cp_home_loc_helper,
547  .co_complete = &m0_dix_cm_cp_complete,
548  .co_free = &m0_dix_cm_cp_free,
549 };
550 
551 M0_INTERNAL const struct m0_cm_cp_ops m0_dix_cm_rebalance_cp_ops = {
552  .co_action = {
568  },
569  .co_action_nr = M0_CCP_NR,
570  .co_phase_next = NULL,
571  .co_invariant = &m0_dix_cm_cp_invariant,
572  .co_home_loc_helper = &m0_dix_cm_cp_home_loc_helper,
573  .co_complete = &m0_dix_cm_cp_complete,
574  .co_free = &m0_dix_cm_cp_free,
575 };
576 
579 #undef M0_TRACE_SUBSYSTEM
580 
581 /*
582  * Local variables:
583  * c-indentation-style: "K&R"
584  * c-basic-offset: 8
585  * tab-width: 8
586  * fill-column: 80
587  * scroll-step: 1
588  * End:
589  */
M0_INTERNAL void m0_long_lock_link_init(struct m0_long_lock_link *link, struct m0_fom *fom, struct m0_long_lock_addb2 *addb2)
Definition: fom_long_lock.c:66
M0_INTERNAL uint64_t m0_dix_cm_cp_home_loc_helper(const struct m0_cm_cp *cp)
Definition: cp.c:74
M0_INTERNAL struct m0_dix_cm * cm2dix(struct m0_cm *cm)
Definition: cm.c:308
M0_INTERNAL void m0_cm_lock(struct m0_cm *cm)
Definition: cm.c:545
M0_INTERNAL void m0_fom_wakeup(struct m0_fom *fom)
Definition: fom.c:532
#define M0_PRE(cond)
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
M0_INTERNAL int m0_dix_cm_cp_io_wait(struct m0_cm_cp *cp, struct m0_fop_type *ft)
Definition: cp.c:479
int dcm_stats_key
Definition: cm.h:143
uint32_t cpx_prio
Definition: cp_onwire.h:38
struct m0_fop * fo_fop
Definition: fom.h:490
#define M0_FOM_LONG_LOCK_RETURN(rc)
#define NULL
Definition: misc.h:38
struct m0_bitmap c_xform_cp_indices
Definition: cp.h:181
struct m0_rpc_at_buf dcx_ab_key
Definition: dix_cp_onwire.h:55
Definition: idx_mock.c:52
#define ergo(a, b)
Definition: misc.h:293
void * m0_locality_data(int key)
Definition: locality.c:474
m0_be_tx_state
Definition: tx.h:214
M0_INTERNAL struct m0_long_lock * m0_ctg_lock(struct m0_cas_ctg *ctg)
Definition: ctg_store.c:2162
#define M0_LOG(level,...)
Definition: trace.h:167
Definition: cp.h:160
M0_LEAVE()
M0_INTERNAL bool m0_rpc_at_is_set(const struct m0_rpc_at_buf *ab)
Definition: at.c:492
struct m0_long_lock_link dc_meta_lock
Definition: cp.h:79
M0_INTERNAL int m0_dix_cm_cp_init(struct m0_cm_cp *cp)
Definition: cp.c:175
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
struct m0_fid dc_ctg_fid
Definition: cp.h:53
M0_INTERNAL const struct m0_cm_cp_ops m0_dix_cm_rebalance_cp_ops
Definition: cp.c:551
struct m0_fom p_fom
Definition: pump.h:51
M0_INTERNAL int m0_dix_cm_cp_send_wait(struct m0_cm_cp *cp)
Definition: net.c:204
void * m0_fop_data(const struct m0_fop *fop)
Definition: fop.c:220
static struct m0_dix_cm * cp2dixcm(struct m0_cm_cp *cp)
Definition: cp.c:55
M0_INTERNAL int m0_dix_cm_cp_dup(struct m0_cm_cp *src, struct m0_cm_cp **dest)
Definition: cp.c:320
M0_INTERNAL int m0_dix_cm_repair_cp_send(struct m0_cm_cp *cp)
Definition: net.c:37
M0_INTERNAL void m0_fom_wait_on(struct m0_fom *fom, struct m0_chan *chan, struct m0_fom_callback *cb)
Definition: fom.c:1490
uint32_t dcx_phase
Definition: dix_cp_onwire.h:53
M0_INTERNAL const struct m0_cm_cp_ops m0_dix_cm_repair_cp_ops
Definition: cp.c:525
M0_INTERNAL void m0_long_write_unlock(struct m0_long_lock *lock, struct m0_long_lock_link *link)
#define container_of(ptr, type, member)
Definition: misc.h:33
#define M0_SET0(obj)
Definition: misc.h:64
struct m0_buf dc_key
Definition: cp.h:90
M0_INTERNAL int m0_dix_cm_cp_read(struct m0_cm_cp *cp)
Definition: cp.c:337
M0_INTERNAL void m0_ctg_insert_credit(struct m0_cas_ctg *ctg, m0_bcount_t knob, m0_bcount_t vnob, struct m0_be_tx_credit *accum)
Definition: ctg_store.c:1905
m0_fom_phase
Definition: fom.h:372
static struct m0_be_tx * m0_fom_tx(struct m0_fom *fom)
Definition: fom.h:537
static void dixcpx_to_dixcp(const struct m0_dix_cpx *dix_cpx, struct m0_dix_cm_cp *dix_cp)
Definition: cp.c:136
int32_t cr_rc
Definition: cp_onwire.h:64
M0_INTERNAL int m0_dix_cm_cp_fini(struct m0_cm_cp *cp)
Definition: cp.c:286
return M0_RC(rc)
static struct m0_cm * cm
Definition: cm.c:63
M0_INTERNAL int m0_cm_cp_dup(struct m0_cm_cp *src, struct m0_cm_cp **dest)
Definition: cp.c:805
struct m0_cas_ctg * dc_ctg
Definition: cp.h:74
M0_INTERNAL void m0_cm_unlock(struct m0_cm *cm)
Definition: cm.c:550
#define M0_ENTRY(...)
Definition: trace.h:170
Definition: cp.h:151
Definition: buf.h:37
M0_INTERNAL int m0_ctg_insert(struct m0_ctg_op *ctg_op, struct m0_cas_ctg *ctg, const struct m0_buf *key, const struct m0_buf *val, int next_phase)
Definition: ctg_store.c:1448
M0_INTERNAL void m0_cm_ag_cp_add(struct m0_cm_aggr_group *ag, struct m0_cm_cp *cp)
Definition: ag.c:510
uint32_t dc_ctg_op_flags
Definition: cp.h:71
M0_INTERNAL int m0_ctg_meta_lookup(struct m0_ctg_op *ctg_op, const struct m0_fid *fid, int next_phase)
Definition: ctg_store.c:1362
struct m0_cpx dcx_cp
Definition: dix_cp_onwire.h:43
static void dix_cm_cp_dtx_fini(struct m0_cm_cp *cp)
Definition: cp.c:100
M0_INTERNAL void m0_dix_cm_cp_free(struct m0_cm_cp *cp)
Definition: cp.c:277
M0_INTERNAL bool m0_long_write_lock(struct m0_long_lock *lk, struct m0_long_lock_link *link, int next_phase)
uint32_t dcx_ctg_op_flags
Definition: dix_cp_onwire.h:48
struct m0_long_lock_link dc_ctg_lock
Definition: cp.h:77
enum m0_cm_cp_io_op c_io_op
Definition: cp.h:196
static int dix_cm_repair_cp_fail(struct m0_cm_cp *cp)
Definition: cp.c:249
return M0_ERR(-EOPNOTSUPP)
M0_INTERNAL int m0_dix_cm_cp_recv_init(struct m0_cm_cp *cp)
Definition: net.c:219
#define M0_AMB(obj, ptr, field)
Definition: misc.h:320
const char * ft_name
Definition: fop.h:225
M0_INTERNAL void m0_dtx_open(struct m0_dtx *tx)
Definition: dtm.c:86
M0_INTERNAL struct m0_cas_ctg * m0_ctg_meta(void)
Definition: ctg_store.c:2130
M0_INTERNAL void m0_long_unlock(struct m0_long_lock *lock, struct m0_long_lock_link *link)
m0_bcount_t b_nob
Definition: buf.h:38
#define M0_ASSERT(cond)
M0_INTERNAL int m0_dix_cm_cp_tx_open(struct m0_cm_cp *cp)
Definition: cp.c:393
int c_rc
Definition: cp.h:218
M0_INTERNAL bool m0_dix_cm_cp_invariant(const struct m0_cm_cp *cp)
Definition: cp.c:62
uint32_t c_data_seg_nr
Definition: cp.h:190
void m0_fom_phase_move(struct m0_fom *fom, int32_t rc, int phase)
Definition: fom.c:1699
M0_INTERNAL void m0_long_lock_link_fini(struct m0_long_lock_link *link)
Definition: fom_long_lock.c:76
struct m0_buf dc_val
Definition: cp.h:92
struct m0_rpc_at_buf dcx_ab_val
Definition: dix_cp_onwire.h:56
const struct m0_cm_cp_ops * c_ops
Definition: cp.h:169
M0_INTERNAL int m0_dix_cm_cp_tx_done(struct m0_cm_cp *cp)
Definition: cp.c:452
M0_INTERNAL int m0_rpc_at_get(const struct m0_rpc_at_buf *ab, struct m0_buf *buf)
Definition: at.c:399
M0_INTERNAL int m0_dix_cm_cp_xform(struct m0_cm_cp *cp)
Definition: cp.c:346
struct m0_cm dcm_base
Definition: cm.h:119
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 int m0_dix_cm_cp_write(struct m0_cm_cp *cp)
Definition: cp.c:413
M0_INTERNAL void m0_dtx_fini(struct m0_dtx *tx)
Definition: dtm.c:134
struct m0_fop_type m0_dix_repair_cpx_reply_fopt
M0_EXTERN struct m0_dix_cm_type dix_repair_dcmt
Definition: cm.h:175
struct m0_long_lock_addb2 dc_ctg_lock_addb2
Definition: cp.h:82
int32_t sm_rc
Definition: sm.h:336
Definition: dump.c:103
struct m0_cm_aggr_group * c_ag
Definition: cp.h:172
M0_INTERNAL uint32_t m0_dix_fid_cctg_device_id(const struct m0_fid *cctg_fid)
Definition: fid_convert.c:81
void m0_rpc_reply_post(struct m0_rpc_item *request, struct m0_rpc_item *reply)
Definition: rpc.c:135
struct m0_long_lock_addb2 dc_meta_lock_addb2
Definition: cp.h:84
M0_INTERNAL void m0_dtx_done(struct m0_dtx *tx)
Definition: dtm.c:115
M0_INTERNAL struct m0_cm_cp * m0_dix_cm_cp_alloc(struct m0_cm *cm)
Definition: cp.c:90
struct m0_sm t_sm
Definition: tx.h:281
Definition: cm.h:117
struct m0_ctg_op dc_ctg_op
Definition: cp.h:65
Definition: cp.h:98
M0_INTERNAL void m0_ctg_op_init(struct m0_ctg_op *ctg_op, struct m0_fom *fom, uint32_t flags)
Definition: ctg_store.c:1759
M0_INTERNAL int m0_dix_cm_cp_recv_wait(struct m0_cm_cp *cp)
Definition: net.c:233
static int dix_cm_fom_tx_wait(struct m0_fom *fom)
Definition: cp.c:169
Definition: fom.h:481
int dc_phase_transmit
Definition: cp.h:87
uint32_t c_buf_nr
Definition: cp.h:187
struct m0_fop_type m0_dix_rebalance_cpx_reply_fopt
Definition: fid.h:38
struct m0_reqh_service * fo_service
Definition: fom.h:505
void(* co_complete)(struct m0_cm_cp *cp)
Definition: cp.h:244
#define M0_ALLOC_PTR(ptr)
Definition: memory.h:86
struct m0_dix_cm_type * dcm_type
Definition: cm.h:122
static int dix_cm_rebalance_cp_fail(struct m0_cm_cp *cp)
Definition: cp.c:254
struct m0_reqh_service cm_service
Definition: cm.h:191
static int dix_cm_cp_dtx_failure(struct m0_cm_cp *cp)
Definition: cp.c:108
bool dcm_cp_in_progress
Definition: cm.h:152
Definition: cm.h:166
M0_INTERNAL int m0_fom_rc(const struct m0_fom *fom)
Definition: fom.c:1727
m0_bcount_t size
Definition: di.c:39
static void dix_cm_cp_reply_send(struct m0_cm_cp *cp, struct m0_fop_type *ft, int rc)
Definition: cp.c:155
static struct m0_fop * fop
Definition: item.c:57
int dc_ctg_op_rc
Definition: cp.h:68
bool dc_is_local
Definition: cp.h:59
M0_INTERNAL void m0_dix_cm_cp_complete(struct m0_cm_cp *cp)
Definition: cp.c:259
static int dix_cm_rebalance_cp_io_wait(struct m0_cm_cp *cp)
Definition: cp.c:520
M0_INTERNAL void m0_dix_cm_cp_tgt_info_fill(struct m0_dix_cm_cp *dix_cp, const struct m0_fid *cctg_fid)
Definition: cp.c:304
struct m0_cm_cp_pump cm_cp_pump
Definition: cm.h:257
M0_INTERNAL void m0_dix_cm_cp_setup(struct m0_dix_cm_cp *dix_cp, const struct m0_fid *cctg_fid, uint64_t failed_unit_index)
Definition: cp.c:310
struct m0_fop * fo_rep_fop
Definition: fom.h:492
M0_INTERNAL int m0_dix_cm_cp_sw_check(struct m0_cm_cp *cp)
Definition: net.c:256
M0_INTERNAL void m0_ctg_op_fini(struct m0_ctg_op *ctg_op)
Definition: ctg_store.c:1788
static struct m0_fop_type * ft[]
Definition: service_ut.c:856
M0_INTERNAL int m0_cm_aggr_group_alloc(struct m0_cm *cm, const struct m0_cm_ag_id *id, bool has_incoming, struct m0_cm_aggr_group **out)
Definition: ag.c:330
M0_INTERNAL void m0_long_read_unlock(struct m0_long_lock *lock, struct m0_long_lock_link *link)
enum m0_cm_cp_priority c_prio
Definition: cp.h:163
struct m0_fid dcx_ctg_fid
Definition: dix_cp_onwire.h:46
uint64_t dcs_write_size
Definition: cm.h:113
void m0_fom_phase_set(struct m0_fom *fom, int phase)
Definition: fom.c:1688
M0_INTERNAL int m0_dix_cm_cp_fail(struct m0_cm_cp *cp, struct m0_fop_type *ft)
Definition: cp.c:230
struct m0_fom c_fom
Definition: cp.h:161
M0_INTERNAL bool m0_fid_is_valid(const struct m0_fid *fid)
Definition: fid.c:96
void m0_free(void *data)
Definition: memory.c:146
uint64_t dcs_read_size
Definition: cm.h:112
M0_INTERNAL struct m0_dix_cm_cp * cp2dixcp(const struct m0_cm_cp *cp)
Definition: cp.c:50
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
static int dix_cm_repair_cp_io_wait(struct m0_cm_cp *cp)
Definition: cp.c:515
struct m0_pdclust_src_addr src
Definition: fd.c:108
int32_t rc
Definition: trigger_fop.h:47
struct m0_cm_cp dc_base
Definition: cp.h:50
M0_INTERNAL int m0_dix_cm_cp_write_pre(struct m0_cm_cp *cp)
Definition: cp.c:357
M0_INTERNAL int m0_dix_cm_rebalance_cp_send(struct m0_cm_cp *cp)
Definition: net.c:37
Definition: fop.h:79
M0_INTERNAL int m0_ctg_op_rc(struct m0_ctg_op *ctg_op)
Definition: ctg_store.c:1779
M0_INTERNAL struct m0_reqh * m0_fom_reqh(const struct m0_fom *fom)
Definition: fom.c:283
static int dix_cm_cp_incoming_kv(struct m0_rpc_at_buf *ab_key, struct m0_rpc_at_buf *ab_val, struct m0_buf *key, struct m0_buf *val)
Definition: cp.c:117
struct m0_cm_ag_id cpx_ag_id
Definition: cp_onwire.h:44
Definition: tx.h:280
Definition: idx_mock.c:47
M0_INTERNAL struct m0_cas_ctg * m0_ctg_meta_lookup_result(struct m0_ctg_op *ctg_op)
Definition: ctg_store.c:1377