Motr  M0
cm.c
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2012-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/assert.h"
28 #include "lib/errno.h"
29 #include "lib/misc.h"
30 #include "lib/finject.h"
31 #include "lib/chan.h"
32 #include "lib/locality.h"
33 #include "lib/types.h"
34 
35 #include "fop/fop.h"
36 #include "pool/pool_machine.h"
37 
38 #include "motr/setup.h"
39 #include "net/net.h"
40 #include "ioservice/io_service.h"
41 #include "reqh/reqh.h"
42 #include "rpc/rpc.h"
43 #include "cob/ns_iter.h"
44 #include "cm/proxy.h"
45 #include "sns/cm/ha.h"
46 #include "ha/msg.h"
47 
48 #include "sns/cm/cm_utils.h"
49 #include "sns/cm/iter.h"
50 #include "sns/cm/cm.h"
51 #include "sns/cm/cp.h"
52 #include "sns/cm/ag.h"
53 #include "sns/cm/file.h"
54 #include "lib/locality.h"
55 #include "rm/rm_service.h"
56 
57 #include "conf/diter.h"
58 
371 enum {
373  SNS_SEG_SIZE = 4096,
374 
381 };
382 
383 M0_EXTERN struct m0_cm_type sns_repair_cmt;
384 M0_EXTERN struct m0_cm_type sns_rebalance_cmt;
385 
386 extern const struct m0_sns_cm_helpers repair_helpers;
387 extern const struct m0_sns_cm_helpers rebalance_helpers;
388 
389 M0_INTERNAL struct m0_sns_cm *cm2sns(struct m0_cm *cm)
390 {
391  return container_of(cm, struct m0_sns_cm, sc_base);
392 }
393 
394 M0_INTERNAL int m0_sns_cm_type_register(void)
395 {
396  int rc;
397 
400 
401  return M0_RC(rc);
402 }
403 
404 M0_INTERNAL void m0_sns_cm_type_deregister(void)
405 {
408 }
409 
410 M0_INTERNAL struct m0_cm_cp *m0_sns_cm_cp_alloc(struct m0_cm *cm)
411 {
412  struct m0_sns_cm_cp *scp;
413 
414  M0_ALLOC_PTR(scp);
415  if (scp == NULL)
416  return NULL;
417 
418  return &scp->sc_base;
419 }
420 
422 {
423  /* Buffer pool is below threshold. */
424 }
425 
427 {
429  sb_bp);
430  m0_chan_signal(&bp->sb_wait);
431 }
432 
435  .nbpo_below_threshold = bp_below_threshold
436 };
437 
438 static void sns_cm_bp_init(struct m0_sns_cm_buf_pool *sbp)
439 {
440  m0_chan_init(&sbp->sb_wait, &sbp->sb_bp.nbp_mutex);
441 }
442 
443 static void sns_cm_bp_fini(struct m0_sns_cm_buf_pool *sbp)
444 {
445  m0_chan_fini_lock(&sbp->sb_wait);
446 }
447 
448 M0_TL_DESCR_DECLARE(cs_eps, extern);
449 M0_TL_DECLARE(cs_eps, M0_INTERNAL, struct cs_endpoint_and_xprt);
450 
451 M0_INTERNAL int m0_sns_cm_rm_init(struct m0_sns_cm *scm)
452 {
453  struct m0_reqh *reqh = m0_sns_cm2reqh(scm);
454  struct m0_motr *motr = m0_cs_ctx_get(reqh);
456  int rc;
457 
458  M0_ENTRY("scm: %p", scm);
459  M0_ASSERT(pc->pc_nr_devices > 0);
460 
461  if (!reqh->rh_oostore) {
462  scm->sc_rm_ctx.rc_pc = pc;
464  /*
465  * XXX Init and register new resource type for file locks.
466  * m0_rm_type_register() starts local credit processing thread for
467  * processing incoming replies. This is necessary when rm service
468  * runs on the same motr instance on which sns cm service is running.
469  * Currently, it is not clear if the RM service would be running in a
470  * separate motr instance on which no other service (except MDS) is
471  * running.
472  **/
475  &scm->sc_rm_ctx.rc_rt);
476  }
477 
478  rc = m0_scmfctx_htable_init(&scm->sc_file_ctx, pc->pc_nr_devices);
479  if (rc != 0)
480  goto end;
481 
483 end:
484  return M0_RC(rc);
485 }
486 
487 M0_INTERNAL int m0_sns_cm_setup(struct m0_cm *cm)
488 {
489  struct m0_reqh *reqh;
490  struct m0_net_domain *ndom;
491  struct m0_sns_cm *scm;
492  uint64_t colours;
493  m0_bcount_t segment_size;
494  uint32_t segments_nr;
495  int rc;
496 
497  M0_ENTRY("cm: %p", cm);
498 
499  scm = cm2sns(cm);
501  /*
502  * Total number of colours in incoming and outgoing buffer pools is
503  * same as the total number of localities in the reqh fom domain.
504  */
505  colours = m0_reqh_nr_localities(reqh);
507  m0_net_xprt_default_get()->nx_name);
508  /*
509  * XXX This should be fixed, buffer pool ops should be a parameter to
510  * m0_net_buffer_pool_init() as it is NULL checked in
511  * m0_net_buffer_pool_invariant().
512  */
515  segment_size = m0_net_domain_get_max_buffer_segment_size(ndom);
516  segments_nr = m0_net_domain_get_max_buffer_segments(ndom);
517  M0_LOG(M0_DEBUG, "sns segments_nr=%d", segments_nr);
519  0, segments_nr, segment_size,
520  colours, M0_0VEC_SHIFT,
521  /* dont_dump */true);
522  if (rc == 0) {
524  0, segments_nr, segment_size,
525  colours, M0_0VEC_SHIFT,
526  /* dont_dump */true);
527  if (rc != 0)
529  }
530 
531  if (rc == 0) {
533  if (rc != 0)
534  return M0_RC(rc);
537  }
538  M0_LEAVE();
539  return M0_RC(rc);
540 }
541 
542 M0_INTERNAL bool m0_sns_is_peer(struct m0_cm *cm,
543  struct m0_reqh_service_ctx *ctx)
544 {
545  return ctx->sc_type == M0_CST_IOS;
546 }
547 
549  size_t bufs_nr)
550 {
551  size_t bnr;
552 
555  bnr = m0_net_buffer_pool_provision(bp, bufs_nr);
557 
558  return bnr;
559 }
560 
561 M0_INTERNAL int m0_sns_cm_prepare(struct m0_cm *cm)
562 {
563  struct m0_sns_cm *scm = cm2sns(cm);
564  struct m0_reqh *reqh = m0_sns_cm2reqh(scm);
565  struct m0_motr *motr = m0_cs_ctx_get(reqh);
566  int bufs_nr;
567  int rc;
568 
569  M0_ENTRY("cm: %p", cm);
571 
573  if (rc != 0)
574  return M0_ERR_INFO(rc, "SNS RM init failed");
575 
576  if (scm->sc_ibp.sb_bp.nbp_buf_nr == 0 &&
577  scm->sc_obp.sb_bp.nbp_buf_nr == 0) {
580  M0_LOG(M0_DEBUG, "Got buffers in: [%d]", bufs_nr);
581  if (bufs_nr == 0)
582  return M0_ERR(-ENOMEM);
585  M0_LOG(M0_DEBUG, "Got buffers out: [%d]", bufs_nr);
586  /*
587  * If bufs_nr is 0, then just return -ENOMEM, as cm_setup() was
588  * successful, both the buffer pools (incoming and outgoing)
589  * will be finalised in cm_fini().
590  */
591  if (bufs_nr == 0)
592  return M0_ERR(-ENOMEM);
593  }
594  scm->sc_ibp_reserved_nr = 0;
595 
600 
601  M0_LEAVE();
602  return M0_RC(rc);
603 }
604 
605 M0_INTERNAL int m0_sns_cm_fail_dev_log(struct m0_cm *cm,
606  enum m0_pool_nd_state state)
607 {
609  struct m0_pool *pool;
610  struct m0_pooldev *pd;
611  uint32_t nr_devs = 0;
612  char *pd_state[M0_PNDS_NR] = {
613  [M0_PNDS_SNS_REPAIRING] = "Repairing",
614  [M0_PNDS_SNS_REBALANCING] = "Rebalancing"
615  };
616 
617  M0_PRE(cm != NULL);
619 
620  m0_tl_for(pools, &pc->pc_pools, pool) {
621  m0_tl_for(pool_failed_devs, &pool->po_failed_devices, pd) {
622  if (pd->pd_state == state) {
623  M0_LOG(M0_NOTICE, " %s disk "FID_F
624  " from pool "FID_F,
625  pd_state[pd->pd_state],
626  FID_P(&pd->pd_id),
627  FID_P(&pool->po_id));
628  M0_CNT_INC(nr_devs);
629  }
630  } m0_tl_endfor;
631  } m0_tl_endfor;
632 
633  if (nr_devs == 0) {
634  M0_LOG(M0_ERROR, "No disk found for %s", pd_state[state]);
635  return -ENOENT;
636  }
637 
638  return 0;
639 }
640 
641 M0_INTERNAL int m0_sns_cm_start(struct m0_cm *cm)
642 {
643  struct m0_sns_cm *scm = cm2sns(cm);
644  size_t loc_nr = m0_fom_dom()->fd_localities_nr;
645  int rc;
646 
647  M0_ENTRY("cm: %p", cm);
649 
651  if (scm->sc_total_read_size == NULL)
652  return M0_ERR(-ENOMEM);
654  if (scm->sc_total_write_size == NULL) {
656  return M0_ERR(-ENOMEM);
657  }
659  if (rc != 0) {
662  return M0_ERR(rc);
663  }
666 
667  return M0_RC(rc);
668 }
669 
670 M0_INTERNAL void m0_sns_cm_rm_fini(struct m0_sns_cm *scm)
671 {
672  M0_ENTRY("scm: %p", scm);
673 
675  m0_scmfctx_htable_fini(&scm->sc_file_ctx);
676 
677  if (!m0_sns_cm2reqh(scm)->rh_oostore)
679 }
680 
682 {
685  {;}
687 }
688 
690 {
694  scm->sc_ibp.sb_bp.nbp_buf_nr == 0);
695 }
696 
697 static bool sns_cm_status_get(struct m0_sns_cm *scm,
698  size_t *tread, size_t *twrite)
699 {
700  size_t loc_nr = m0_fom_dom()->fd_localities_nr;
701  int i;
702 
703  if (scm->sc_total_read_size != NULL &&
705  *tread = 0;
706  *twrite = 0;
707  for (i = 0; i < loc_nr; ++i) {
708  *tread += scm->sc_total_read_size[i];
709  *twrite += scm->sc_total_write_size[i];
710  }
711  return true;
712  }
713  return false;
714 }
715 
716 M0_INTERNAL void m0_sns_cm_stop(struct m0_cm *cm)
717 {
718  struct m0_sns_cm *scm = cm2sns(cm);
719  size_t twrite;
720  size_t tread;
721 
722  M0_ENTRY();
723 
726  if (sns_cm_status_get(scm, &tread, &twrite)) {
727  M0_LOG(M0_WARN, "Time: %llu Read Size: %llu Write size: %llu",
728  (unsigned long long)m0_time_sub(scm->sc_stop_time,
729  scm->sc_start_time),
730  (unsigned long long)tread, (unsigned long long)twrite);
734  }
738 
739  M0_LEAVE();
740 }
741 
742 M0_INTERNAL void m0_sns_cm_print_status(struct m0_sns_cm *scm)
743 {
744  size_t twrite;
745  size_t tread;
746  m0_time_t now = m0_time_now();
747 
748  if (scm->sc_last_status_print_time + M0_MKTIME(60,0) < now &&
749  sns_cm_status_get(scm, &tread, &twrite)) {
751  m0_console_printf("SNS-%02"PRIu32": read=%zu written=%zu\n",
752  scm->sc_repair_done, tread, twrite);
753  }
754 }
755 
756 M0_INTERNAL void m0_sns_cm_ha_msg(struct m0_cm *cm, struct m0_ha_msg *msg,
757  int rc)
758 {
759  struct m0_sns_cm *scm = cm2sns(cm);
760 
761  *msg = (struct m0_ha_msg) {
762  .hm_time = m0_time_now(),
763  .hm_data = {
764  .hed_type = M0_HA_MSG_SNS_ERR,
765  .u.hed_ha_sns_err = (struct m0_ha_sns_err) {
766  .hse_errcode = (uint32_t)rc,
767  .hse_opcode = (uint8_t)scm->sc_op
768  }
769  }
770  };
771 }
772 
773 M0_INTERNAL void m0_sns_cm_fini(struct m0_cm *cm)
774 {
775  struct m0_sns_cm *scm;
776 
777  M0_ENTRY("cm: %p", cm);
778 
779  scm = cm2sns(cm);
781 
782  /*
783  * Finalise parents first to avoid usage of finalised mutexes.
784  * m0_sns_cm_setup() makes initialisation in reverse order too.
785  */
788 
791 
792  M0_LEAVE();
793 }
794 
795 M0_INTERNAL uint64_t m0_sns_cm_cp_buf_nr(struct m0_net_buffer_pool *bp,
796  uint64_t data_seg_nr)
797 {
798  return data_seg_nr % bp->nbp_seg_nr ?
799  data_seg_nr / bp->nbp_seg_nr + 1 :
800  data_seg_nr / bp->nbp_seg_nr;
801 }
802 
803 M0_INTERNAL void m0_sns_cm_buf_wait(struct m0_sns_cm_buf_pool *sbp, struct m0_fom *fom)
804 {
806  m0_fom_wait_on(fom, &sbp->sb_wait, &fom->fo_cb);
808 }
809 
811  struct m0_cm_cp *cp)
812 {
813  struct m0_net_buffer *buf;
814  size_t colour;
815  uint32_t seg_nr = 0;
816  uint32_t rem_bufs;
817  int rc = 0;
818 
819  colour = cp_home_loc_helper(cp) % bp->nbp_colours_nr;
820  rem_bufs = m0_sns_cm_cp_buf_nr(bp, cp->c_data_seg_nr);
821  rem_bufs -= cp->c_buf_nr;
823  while (rem_bufs > 0) {
824  buf = m0_cm_buffer_get(bp, colour);
825  if (buf == NULL) {
826  rc = -ENOBUFS;
827  goto out;
828  }
829  m0_cm_cp_buf_add(cp, buf);
830  if (cp->c_data_seg_nr > (cp->c_buf_nr * bp->nbp_seg_nr))
831  seg_nr = bp->nbp_seg_nr;
832  else
833  seg_nr = cp->c_data_seg_nr -
834  ((cp->c_buf_nr - 1) * bp->nbp_seg_nr);
835  buf->nb_buffer.ov_vec.v_nr = seg_nr;
836  M0_CNT_DEC(rem_bufs);
837  }
838  if (bp->nbp_free > 0)
839  bp->nbp_ops->nbpo_not_empty(bp);
840 out:
842  return M0_RC(rc);
843 }
844 
845 M0_INTERNAL uint64_t m0_sns_cm_data_seg_nr(struct m0_sns_cm *scm,
846  struct m0_pdclust_layout *pl)
847 {
848  M0_PRE(scm != NULL && pl != NULL);
849 
850  return m0_pdclust_unit_size(pl) %
856 }
857 
858 M0_INTERNAL int64_t
860  const struct m0_cm_ag_id *id)
861 {
862  uint64_t nr_cp_bufs;
863  uint64_t cp_data_seg_nr;
864  uint32_t nr_cps_in;
865  uint32_t nr_units_in;
866  struct m0_pdclust_layout *pl;
867  struct m0_sns_cm_file_ctx *fctx;
868  int rc;
869 
870  fctx = m0_sns_cm_fctx_get(scm, id);
871  M0_ASSERT(fctx != NULL);
872 
874  rc = m0_sns_cm_ag_in_cp_units(scm, id, fctx, &nr_cps_in,
875  &nr_units_in, NULL);
876  if (rc != 0)
877  return M0_ERR(rc);
878  cp_data_seg_nr = m0_sns_cm_data_seg_nr(scm, pl);
879  nr_cp_bufs = m0_sns_cm_cp_buf_nr(&scm->sc_ibp.sb_bp, cp_data_seg_nr);
880  m0_sns_cm_fctx_put(scm, id);
881 
882  return nr_cp_bufs * nr_cps_in;
883 }
884 
894 M0_INTERNAL int m0_sns_cm_has_space_for(struct m0_sns_cm *scm,
895  struct m0_pdclust_layout *pl,
896  uint64_t nr_bufs)
897 {
898  struct m0_net_buffer_pool *ibp;
899  int rc = 0;
900 
901  M0_PRE(scm != NULL && pl != NULL);
903 
904  ibp = &scm->sc_ibp.sb_bp;
906  if (nr_bufs + scm->sc_ibp_reserved_nr > ibp->nbp_free)
907  rc = -ENOSPC;
909  M0_LOG(M0_DEBUG, "nr_bufs: [%" PRIu64 "] free buffers in: [%u] out: [%u] "
910  "sc_ibp_reserved_nr: [%" PRIu64 "]", nr_bufs, ibp->nbp_free,
912 
913  return M0_RC(rc);
914 }
915 
916 M0_INTERNAL void m0_sns_cm_reserve_space(struct m0_sns_cm *scm, size_t nr_bufs)
917 {
918  struct m0_net_buffer_pool *ibp;
919 
920  ibp = &scm->sc_ibp.sb_bp;
924 }
925 
926 M0_INTERNAL void m0_sns_cm_cancel_reservation(struct m0_sns_cm *scm, size_t nr_bufs)
927 {
928  struct m0_net_buffer_pool *ibp;
929 
930  ibp = &scm->sc_ibp.sb_bp;
933  M0_LOG(M0_DEBUG, "reserved: %u nr_bufs: %u", (unsigned)scm->sc_ibp_reserved_nr, (unsigned)nr_bufs);
934  ibp->nbp_ops->nbpo_not_empty(ibp);
936 }
937 
938 M0_INTERNAL int m0_sns_cm_ag_next(struct m0_cm *cm,
939  const struct m0_cm_ag_id *id_curr,
940  struct m0_cm_ag_id *id_next)
941 {
942  struct m0_sns_cm *scm = cm2sns(cm);
943 
944  M0_PRE(cm != NULL);
946 
947  return m0_sns_cm_ag__next(scm, id_curr, id_next);
948 }
949 
950 #undef M0_TRACE_SUBSYSTEM
951 
953 /*
954  * Local variables:
955  * c-indentation-style: "K&R"
956  * c-basic-offset: 8
957  * tab-width: 8
958  * fill-column: 80
959  * scroll-step: 1
960  * End:
961  */
M0_INTERNAL m0_bcount_t m0_net_domain_get_max_buffer_segment_size(struct m0_net_domain *dom)
M0_INTERNAL void m0_net_buffer_pool_fini(struct m0_net_buffer_pool *pool)
Definition: buffer_pool.c:154
Definition: cm.h:205
#define M0_PRE(cond)
#define M0_ALLOC_ARR(arr, nr)
Definition: memory.h:84
struct m0_rm_resource_type rc_rt
Definition: cm.h:200
static uint32_t seg_nr
Definition: net.c:119
struct m0_sns_cm_buf_pool sc_obp
Definition: cm.h:240
#define NULL
Definition: misc.h:38
const struct m0_sns_cm_helpers rebalance_helpers
Definition: helpers.c:356
struct m0_htable sc_file_ctx
Definition: cm.h:268
struct m0_rm_domain rc_dom
Definition: cm.h:199
M0_INTERNAL struct m0_sns_cm * cm2sns(struct m0_cm *cm)
Definition: cm.c:389
m0_bcount_t nbp_seg_size
Definition: buffer_pool.h:255
M0_INTERNAL void m0_sns_cm_iter_stop(struct m0_sns_cm_iter *it)
Definition: iter.c:908
static void buf_available(struct m0_net_buffer_pool *pool)
Definition: cm.c:426
M0_INTERNAL void m0_cm_type_deregister(struct m0_cm_type *cmtype)
Definition: cm.c:1019
uint64_t m0_time_t
Definition: time.h:37
#define M0_LOG(level,...)
Definition: trace.h:167
Definition: cp.h:160
M0_LEAVE()
M0_INTERNAL void m0_net_buffer_pool_unlock(struct m0_net_buffer_pool *pool)
Definition: buffer_pool.c:203
void m0_console_printf(const char *fmt,...)
Definition: trace.c:801
M0_INTERNAL int m0_sns_cm_has_space_for(struct m0_sns_cm *scm, struct m0_pdclust_layout *pl, uint64_t nr_bufs)
Definition: cm.c:894
const struct m0_net_buffer_pool_ops * nbp_ops
Definition: buffer_pool.h:263
struct m0_chan sb_wait
Definition: cm.h:141
M0_INTERNAL void m0_ios_cdom_get(struct m0_reqh *reqh, struct m0_cob_domain **out)
Definition: io_service.c:463
static void sns_cm_bp_init(struct m0_sns_cm_buf_pool *sbp)
Definition: cm.c:438
struct m0_layout * sf_layout
Definition: file.h:74
m0_time_t sc_last_status_print_time
Definition: cm.h:257
static struct m0_sns_cm * scm
Definition: cm.c:64
M0_INTERNAL int m0_sns_cm_setup(struct m0_cm *cm)
Definition: cm.c:487
M0_INTERNAL size_t m0_sns_cm_buffer_pool_provision(struct m0_net_buffer_pool *bp, size_t bufs_nr)
Definition: cm.c:548
M0_INTERNAL void m0_rm_domain_init(struct m0_rm_domain *dom)
Definition: rm.c:215
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 m0_bcount_t
Definition: types.h:77
struct m0_sns_cm_buf_pool sc_ibp
Definition: cm.h:227
static int void * buf
Definition: dir.c:1019
#define container_of(ptr, type, member)
Definition: misc.h:33
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_pools_common * rc_pc
Definition: cm.h:202
m0_time_t sc_stop_time
Definition: cm.h:255
M0_INTERNAL int m0_sns_cm_iter_init(struct m0_sns_cm_iter *it)
Definition: iter.c:871
Definition: sock.c:887
static struct m0_pools_common pc
Definition: iter_ut.c:59
#define m0_tl_endfor
Definition: tlist.h:700
return M0_RC(rc)
static struct m0_cm * cm
Definition: cm.c:63
#define M0_ENTRY(...)
Definition: trace.h:170
enum m0_cm_op sc_op
Definition: cm.h:209
M0_INTERNAL struct m0_sns_cm_file_ctx * m0_sns_cm_fctx_get(struct m0_sns_cm *scm, const struct m0_cm_ag_id *id)
Definition: file.c:457
M0_INTERNAL void m0_sns_cm_ag_iter_fini(struct m0_sns_cm_ag_iter *ai)
Definition: ag.c:380
M0_INTERNAL void m0_sns_cm_ha_msg(struct m0_cm *cm, struct m0_ha_msg *msg, int rc)
Definition: cm.c:756
M0_INTERNAL void m0_chan_signal(struct m0_chan *chan)
Definition: chan.c:159
int i
Definition: dir.c:1033
#define PRIu64
Definition: types.h:58
struct m0_cm_cp sc_base
Definition: cp.h:39
#define M0_ERR_INFO(rc, fmt,...)
Definition: trace.h:215
return M0_ERR(-EOPNOTSUPP)
struct m0_mutex sc_file_ctx_mutex
Definition: cm.h:271
m0_time_t sc_start_time
Definition: cm.h:249
const struct m0_sns_cm_helpers repair_helpers
Definition: helpers.c:238
M0_INTERNAL struct m0_net_buffer * m0_cm_buffer_get(struct m0_net_buffer_pool *bp, uint64_t colour)
Definition: cm.c:1057
M0_INTERNAL int m0_sns_cm_start(struct m0_cm *cm)
Definition: cm.c:641
M0_INTERNAL bool m0_net_buffer_pool_invariant(const struct m0_net_buffer_pool *pool)
Definition: buffer_pool.c:50
uint32_t sc_repair_done
Definition: cm.h:243
M0_INTERNAL void m0_sns_cm_stop(struct m0_cm *cm)
Definition: cm.c:716
M0_INTERNAL void m0_chan_init(struct m0_chan *chan, struct m0_mutex *ch_guard)
Definition: chan.c:96
#define M0_ASSERT(cond)
M0_INTERNAL bool m0_net_buffer_pool_prune(struct m0_net_buffer_pool *pool)
Definition: buffer_pool.c:310
m0_time_t m0_time_now(void)
Definition: time.c:134
uint32_t c_data_seg_nr
Definition: cp.h:190
m0_pool_nd_state
Definition: pool_machine.h:57
M0_TL_DECLARE(cs_eps, M0_INTERNAL, struct cs_endpoint_and_xprt)
uint32_t pc_nr_devices
Definition: pool.h:196
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
void(* nbpo_not_empty)(struct m0_net_buffer_pool *)
Definition: buffer_pool.h:150
M0_INTERNAL void m0_cm_cp_buf_add(struct m0_cm_cp *cp, struct m0_net_buffer *nb)
Definition: cp.c:703
M0_INTERNAL void m0_net_buffer_pool_lock(struct m0_net_buffer_pool *pool)
Definition: buffer_pool.c:186
struct m0_sns_cm_ag_iter sc_ag_it
Definition: cm.h:222
M0_EXTERN struct m0_cm_type sns_repair_cmt
Definition: cm.c:383
M0_INTERNAL int m0_sns_cm_prepare(struct m0_cm *cm)
Definition: cm.c:561
M0_INTERNAL struct m0_pdclust_layout * m0_layout_to_pdl(const struct m0_layout *l)
Definition: pdclust.c:382
struct m0_net_xprt * m0_net_xprt_default_get(void)
Definition: net.c:151
M0_INTERNAL int m0_sns_cm_rm_init(struct m0_sns_cm *scm)
Definition: cm.c:451
bool rh_oostore
Definition: reqh.h:171
M0_INTERNAL void m0_mutex_init(struct m0_mutex *mutex)
Definition: mutex.c:35
M0_INTERNAL uint64_t m0_reqh_nr_localities(const struct m0_reqh *reqh)
Definition: reqh.c:723
Definition: msg.h:115
Definition: reqh.h:94
M0_TL_DESCR_DECLARE(cs_eps, extern)
struct m0_fid pd_id
Definition: pool.h:428
Definition: dump.c:103
M0_INTERNAL struct m0_net_domain * m0_cs_net_domain_locate(struct m0_motr *cctx, const char *xprt_name)
Definition: setup.c:466
M0_INTERNAL int m0_sns_cm_ag_in_cp_units(const struct m0_sns_cm *scm, const struct m0_cm_ag_id *id, struct m0_sns_cm_file_ctx *fctx, uint32_t *in_cp_nr, uint32_t *in_units_nr, struct m0_cm_proxy_in_count *pcount)
Definition: cm_utils.c:526
struct m0_cob_domain * sc_cob_dom
Definition: cm.h:217
#define FID_P(f)
Definition: fid.h:77
static void sns_cm_bp_fini(struct m0_sns_cm_buf_pool *sbp)
Definition: cm.c:443
M0_INTERNAL struct m0_reqh * m0_sns_cm2reqh(const struct m0_sns_cm *snscm)
Definition: cm_utils.c:547
static struct m0_pool pool
Definition: iter_ut.c:58
M0_INTERNAL void m0_sns_cm_buf_wait(struct m0_sns_cm_buf_pool *sbp, struct m0_fom *fom)
Definition: cm.c:803
uint8_t hse_opcode
Definition: ha.h:126
Definition: fom.h:481
Definition: cm.h:143
static void sns_cm_buffer_pools_prune(struct m0_sns_cm *scm)
Definition: cm.c:689
#define PRIu32
Definition: types.h:66
M0_INTERNAL void m0_sns_cm_type_deregister(void)
Definition: cm.c:404
M0_INTERNAL void m0_sns_cm_fctx_cleanup(struct m0_sns_cm *scm)
Definition: file.c:180
Definition: setup.h:354
uint32_t c_buf_nr
Definition: cp.h:187
M0_INTERNAL bool m0_sns_is_peer(struct m0_cm *cm, struct m0_reqh_service_ctx *ctx)
Definition: cm.c:542
struct m0_reqh reqh
Definition: rm_foms.c:48
static void bp_below_threshold(struct m0_net_buffer_pool *bp)
Definition: cm.c:421
static bool sns_cm_status_get(struct m0_sns_cm *scm, size_t *tread, size_t *twrite)
Definition: cm.c:697
static uint32_t min32u(uint32_t a, uint32_t b)
Definition: arith.h:56
struct m0_net_buffer_pool sb_bp
Definition: cm.h:135
struct m0_mutex nbp_mutex
Definition: buffer_pool.h:259
#define M0_CNT_INC(cnt)
Definition: arith.h:226
M0_INTERNAL uint64_t m0_sns_cm_data_seg_nr(struct m0_sns_cm *scm, struct m0_pdclust_layout *pl)
Definition: cm.c:845
const struct m0_net_buffer_pool_ops bp_ops
Definition: cm.c:433
M0_EXTERN struct m0_cm_type sns_rebalance_cmt
Definition: cm.c:384
static struct m0_sns_cm_cp scp
Definition: cm.c:65
#define M0_ALLOC_PTR(ptr)
Definition: memory.h:86
struct m0_motr motr
uint64_t sc_ibp_reserved_nr
Definition: cm.h:237
struct m0_reqh_service cm_service
Definition: cm.h:191
M0_INTERNAL struct m0_fom_domain * m0_fom_dom(void)
Definition: locality.c:575
M0_INTERNAL int m0_sns_cm_ag__next(struct m0_sns_cm *scm, const struct m0_cm_ag_id *id_curr, struct m0_cm_ag_id *id_next)
Definition: ag.c:320
m0_time_t m0_time_sub(const m0_time_t t1, const m0_time_t t2)
Definition: time.c:65
size_t * sc_total_read_size
Definition: cm.h:259
Definition: cm.h:166
struct m0_tl pc_pools
Definition: pool.h:162
M0_INTERNAL int m0_net_buffer_pool_provision(struct m0_net_buffer_pool *pool, uint32_t buf_nr)
Definition: buffer_pool.c:125
m0_time_t hm_time
Definition: msg.h:120
struct m0_pools_common * rh_pools
Definition: reqh.h:118
M0_INTERNAL int m0_sns_cm_type_register(void)
Definition: cm.c:394
M0_INTERNAL int32_t m0_net_domain_get_max_buffer_segments(struct m0_net_domain *dom)
M0_INTERNAL void m0_sns_cm_cancel_reservation(struct m0_sns_cm *scm, size_t nr_bufs)
Definition: cm.c:926
static void buffer_pool_prune(struct m0_net_buffer_pool *bp)
Definition: cm.c:681
struct m0_fid po_id
Definition: pool.h:81
struct m0_sns_cm_rm_ctx sc_rm_ctx
Definition: cm.h:274
M0_INTERNAL void m0_sns_cm_print_status(struct m0_sns_cm *scm)
Definition: cm.c:742
M0_INTERNAL int m0_rm_type_register(struct m0_rm_domain *dom, struct m0_rm_resource_type *rt)
Definition: rm.c:252
M0_INTERNAL int m0_sns_cm_iter_start(struct m0_sns_cm_iter *it)
Definition: iter.c:888
#define M0_CNT_DEC(cnt)
Definition: arith.h:219
m0_bcount_t cc_sns_buf_nr
Definition: setup.h:440
M0_INTERNAL int m0_sns_cm_fail_dev_log(struct m0_cm *cm, enum m0_pool_nd_state state)
Definition: cm.c:605
struct m0_cm sc_base
Definition: cm.h:206
#define M0_MKTIME(secs, ns)
Definition: time.h:86
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
static struct m0_sns_cm_file_ctx fctx
Definition: net.c:55
Definition: pool.h:80
struct m0_sns_cm_iter sc_it
Definition: cm.h:220
M0_INTERNAL struct m0_cm_cp * m0_sns_cm_cp_alloc(struct m0_cm *cm)
Definition: cm.c:410
static struct bulkio_params * bp
Definition: bulkio_ut.c:44
Definition: nucleus.c:42
#define out(...)
Definition: gen.c:41
M0_INTERNAL void m0_sns_cm_fini(struct m0_cm *cm)
Definition: cm.c:773
struct m0_pools_common cc_pools_common
Definition: setup.h:356
M0_INTERNAL void m0_rm_type_deregister(struct m0_rm_resource_type *rt)
Definition: rm.c:288
M0_INTERNAL uint64_t cp_home_loc_helper(const struct m0_cm_cp *cp)
Definition: cp.c:80
M0_INTERNAL bool m0_cm_is_locked(const struct m0_cm *cm)
Definition: cm.c:560
static int loc_nr(void)
Definition: locality.c:330
struct m0_reqh * rs_reqh
Definition: reqh_service.h:259
Definition: cm.c:372
#define m0_tl_for(name, head, obj)
Definition: tlist.h:695
M0_INTERNAL void m0_chan_fini_lock(struct m0_chan *chan)
Definition: chan.c:112
void m0_free(void *data)
Definition: memory.c:146
size_t fd_localities_nr
Definition: fom.h:333
M0_INTERNAL int m0_net_buffer_pool_init(struct m0_net_buffer_pool *pool, struct m0_net_domain *ndom, uint32_t threshold, uint32_t seg_nr, m0_bcount_t seg_size, uint32_t colours, unsigned shift, bool dont_dump)
Definition: buffer_pool.c:82
M0_INTERNAL struct m0_motr * m0_cs_ctx_get(struct m0_reqh *reqh)
Definition: setup.c:1778
M0_INTERNAL void m0_sns_cm_rm_fini(struct m0_sns_cm *scm)
Definition: cm.c:670
int32_t rc
Definition: trigger_fop.h:47
M0_INTERNAL void m0_sns_cm_fctx_put(struct m0_sns_cm *scm, const struct m0_cm_ag_id *id)
Definition: file.c:481
M0_INTERNAL int m0_sns_cm_ag_next(struct m0_cm *cm, const struct m0_cm_ag_id *id_curr, struct m0_cm_ag_id *id_next)
Definition: cm.c:938
Definition: ag.h:49
M0_INTERNAL uint64_t m0_pdclust_unit_size(const struct m0_pdclust_layout *pl)
Definition: pdclust.c:377
M0_INTERNAL void m0_sns_cm_iter_fini(struct m0_sns_cm_iter *it)
Definition: iter.c:922
#define FID_F
Definition: fid.h:75
Definition: trace.h:478
M0_INTERNAL int m0_sns_cm_ag_iter_init(struct m0_sns_cm_ag_iter *ai)
Definition: ag.c:369
M0_INTERNAL void m0_sns_cm_flock_resource_set(struct m0_sns_cm *scm)
Definition: file.c:201
M0_INTERNAL void m0_sns_cm_reserve_space(struct m0_sns_cm *scm, size_t nr_bufs)
Definition: cm.c:916
M0_INTERNAL int m0_cm_type_register(struct m0_cm_type *cmtype)
Definition: cm.c:995
struct m0_tl po_failed_devices
Definition: pool.h:93
size_t * sc_total_write_size
Definition: cm.h:260
static uint nr_bufs