Motr  M0
helpers.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/misc.h"
26 
27 #include "sns/parity_repair.h"
28 #include "sns/cm/cm_utils.h"
29 #include "sns/cm/file.h"
30 #include "sns/cm/ag.h"
31 #include "cm/proxy.h"
32 #include "pool/pool_machine.h"
33 
34 M0_INTERNAL int m0_sns_cm_repair_ag_setup(struct m0_sns_cm_ag *sag,
35  struct m0_pdclust_layout *pl);
36 
37 static int repair_ag_in_cp_units(const struct m0_sns_cm *scm,
38  const struct m0_cm_ag_id *id,
39  struct m0_sns_cm_file_ctx *fctx,
40  uint32_t *in_cp_nr,
41  uint32_t *in_units_nr,
42  struct m0_cm_proxy_in_count *pcount)
43 {
44  const struct m0_cm *cm = &scm->sc_base;
45  struct m0_pdclust_src_addr sa;
46  struct m0_pdclust_tgt_addr ta;
47  struct m0_fid cobfid;
48  struct m0_fid spare_cob;
49  struct m0_fid gfid;
50  struct m0_poolmach *pm;
51  struct m0_cm_proxy *pxy;
52  struct m0_conf_obj *svc;
53  struct m0_bitmap proxy_map;
54  const char *ep;
55  struct m0_pdclust_layout *pl;
56  bool is_failed;
57  uint32_t incps = 0;
58  uint32_t inunits = 0;
59  uint32_t local_spares = 0;
60  uint32_t tgt_unit_prev;
61  uint64_t unit;
62  int rc = 0;
63  int i;
64 
65  M0_ENTRY();
66  M0_PRE(scm != NULL && id != NULL && fctx != NULL);
67  M0_PRE(in_cp_nr != NULL && in_units_nr != NULL);
68 
69  agid2fid(id, &fctx->sf_fid);
70  sa.sa_group = agid2group(id);
71  pm = fctx->sf_pm;
73  rc = m0_bitmap_init(&proxy_map, scm->sc_base.cm_proxy_nr);
74  if (rc != 0)
75  return M0_ERR(rc);
76  for (unit = 0; unit < m0_sns_cm_ag_size(pl); ++unit) {
77  sa.sa_unit = unit;
78  m0_sns_cm_unit2cobfid(fctx, &sa, &ta, &cobfid);
79  if (m0_sns_cm_unit_is_spare(fctx, sa.sa_group, unit))
80  continue;
81 
82  is_failed = scm->sc_helpers->sch_is_cob_failed(pm, ta.ta_obj);
83  /* Count number of spares corresponding to the failures
84  * on a node. This is required to calculate exact number of
85  * incoming copy packets.
86  */
87  if (is_failed && !m0_sns_cm_is_cob_repaired(pm, ta.ta_obj)) {
90  sa.sa_group, unit,
91  (unsigned *)&sa.sa_unit,
92  &tgt_unit_prev);
94  if (rc != 0) {
95  m0_bitmap_fini(&proxy_map);
96  return M0_ERR(rc);
97  }
98 
99  m0_sns_cm_unit2cobfid(fctx, &sa, &ta, &spare_cob);
101  sa.sa_unit) &&
103  &spare_cob)) {
104  M0_CNT_INC(local_spares);
105  }
106  }
107  if (!is_failed &&
108  !m0_sns_cm_is_local_cob(cm, pm->pm_pver, &cobfid)) {
109  ep = m0_sns_cm_tgt_ep(cm, pm->pm_pver, &cobfid, &svc);
110  pxy = m0_tl_find(proxy, pxy, &cm->cm_proxies,
111  m0_streq(ep, pxy->px_endpoint));
113  if (M0_IN(pxy->px_status, (M0_PX_STOP, M0_PX_FAILED))) {
114  rc = pxy->px_status == M0_PX_STOP ? -ESHUTDOWN :
115  -EHOSTDOWN;
116  m0_bitmap_fini(&proxy_map);
117  return M0_ERR_INFO(rc, " %s", pxy->px_endpoint);
118  }
119 
120  if (!m0_bitmap_get(&proxy_map, pxy->px_id)) {
121  m0_bitmap_set(&proxy_map, pxy->px_id, true);
122  M0_CNT_INC(incps);
123  }
124  M0_CNT_INC(inunits);
125  }
126  }
127 
128  /* set incoming copy packets count per proxy based on local spares */
129  if (pcount != NULL) {
130  for (i = 0; i < pcount->p_nr; ++i) {
131  if (m0_bitmap_get(&proxy_map, i))
132  pcount->p_count[i] = local_spares;
133  }
134  }
135  *in_cp_nr = incps * local_spares;
136  *in_units_nr = inunits;
137  m0_bitmap_fini(&proxy_map);
138 
139  M0_LEAVE();
140  return M0_RC(rc);
141 }
142 
143 static uint64_t repair_ag_unit_start(const struct m0_pdclust_layout *pl)
144 {
145  return 0;
146 }
147 
148 static uint64_t repair_ag_unit_end(const struct m0_pdclust_layout *pl)
149 {
150  return m0_sns_cm_ag_size(pl);
151 }
152 
153 static bool repair_ag_is_relevant(struct m0_sns_cm *scm,
154  struct m0_sns_cm_file_ctx *fctx,
155  uint64_t group)
156 {
157  struct m0_pdclust_src_addr sa;
158  struct m0_pdclust_tgt_addr ta;
159  struct m0_fid cobfid;
160  uint64_t data_unit;
161  uint32_t N;
162  uint32_t K;
163  uint32_t S;
164  uint32_t j;
165  uint32_t spare;
166  struct m0_pdclust_layout *pl;
167  struct m0_poolmach *pm;
168  int rc;
169 
170  M0_ENTRY();
171  M0_PRE(fctx != NULL);
172 
173  pm = fctx->sf_pm;
178  sa.sa_group = group;
179  for (j = N + K; j < N + K + S; ++j) {
180  sa.sa_unit = j;
181  m0_sns_cm_unit2cobfid(fctx, &sa, &ta, &cobfid);
182  if (scm->sc_helpers->sch_is_cob_failed(pm, ta.ta_obj))
183  continue;
184  if (!m0_sns_cm_is_local_cob(&scm->sc_base, pm->pm_pver, &cobfid))
185  continue;
186  spare = j;
187  do {
190  spare, &data_unit);
192  if (rc != 0)
193  break;
194  spare = data_unit;
195  } while (m0_sns_cm_unit_is_spare(fctx, group, data_unit));
196 
197  if (rc != 0)
198  continue;
199  sa.sa_unit = data_unit;
200  m0_sns_cm_unit2cobfid(fctx, &sa, &ta, &cobfid);
202  return true;
203  }
204 
205  return M0_RC(false);
206 }
207 
208 static int
210  struct m0_poolmach *pm, const struct m0_fid *cob_fid)
211 {
212  int rc;
213 
215  if (rc == -ENOENT) {
217  rc = -ENODEV;
218  }
219 
220  return rc;
221 }
222 
223 static bool repair_is_cob_failed(struct m0_poolmach *pm,
224  uint32_t cob_index)
225 {
226  enum m0_pool_nd_state state_out = 0;
227  M0_PRE(pm != NULL);
228 
229  m0_poolmach_device_state(pm, cob_index, &state_out);
230  /* Checking for M0_PNDS_SNS_REBALANCING for the case where the
231  repaired device fails during rebalance, and a new repair is
232  triggered. The cob is not marked as failed, since it was already
233  repaired */
234  return !M0_IN(state_out, (M0_PNDS_ONLINE, M0_PNDS_OFFLINE,
236 }
237 
240  .sch_ag_unit_start = repair_ag_unit_start,
241  .sch_ag_unit_end = repair_ag_unit_end,
242  .sch_ag_is_relevant = repair_ag_is_relevant,
243  .sch_ag_setup = m0_sns_cm_repair_ag_setup,
244  .sch_cob_locate = repair_cob_locate,
245  .sch_is_cob_failed = repair_is_cob_failed
246 };
247 
248 #undef M0_TRACE_SUBSYSTEM
249 
252 /*
253  * Local variables:
254  * c-indentation-style: "K&R"
255  * c-basic-offset: 8
256  * tab-width: 8
257  * fill-column: 80
258  * scroll-step: 1
259  * End:
260  */
M0_INTERNAL uint64_t m0_sns_cm_ag_nr_data_units(const struct m0_pdclust_layout *pl)
Definition: cm_utils.c:222
Definition: cm.h:205
#define M0_PRE(cond)
M0_INTERNAL void m0_sns_cm_unit2cobfid(struct m0_sns_cm_file_ctx *fctx, const struct m0_pdclust_src_addr *sa, struct m0_pdclust_tgt_addr *ta, struct m0_fid *cfid_out)
Definition: cm_utils.c:117
M0_INTERNAL int m0_bitmap_init(struct m0_bitmap *map, size_t nr)
Definition: bitmap.c:86
uint64_t sa_group
Definition: pdclust.h:241
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
#define NULL
Definition: misc.h:38
M0_INTERNAL void m0_bitmap_fini(struct m0_bitmap *map)
Definition: bitmap.c:97
M0_INTERNAL const char * m0_sns_cm_tgt_ep(const struct m0_cm *cm, const struct m0_pool_version *pv, const struct m0_fid *cob_fid, struct m0_conf_obj **hostage)
Definition: cm_utils.c:434
struct m0_pool_version * pm_pver
Definition: pool_machine.h:172
M0_LEAVE()
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)
static bool repair_is_cob_failed(struct m0_poolmach *pm, uint32_t cob_index)
Definition: helpers.c:223
struct m0_layout * sf_layout
Definition: file.h:74
uint64_t ta_obj
Definition: pdclust.h:256
M0_INTERNAL void m0_sns_cm_fctx_unlock(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:58
static struct m0_sns_cm * scm
Definition: cm.c:64
M0_INTERNAL uint64_t m0_sns_cm_ag_nr_parity_units(const struct m0_pdclust_layout *pl)
Definition: cm_utils.c:228
struct m0_fid sf_fid
Definition: file.h:63
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_poolmach * sf_pm
Definition: file.h:70
#define N(i)
uint32_t * p_count
Definition: proxy.h:154
static struct m0_cob_domain * cdom
Definition: xform.c:55
return M0_RC(rc)
static struct m0_cm * cm
Definition: cm.c:63
Definition: sock.c:754
int(* sch_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.h:153
struct m0_tl cm_proxies
Definition: cm.h:246
M0_INTERNAL uint64_t agid2group(const struct m0_cm_ag_id *id)
Definition: ag.c:413
#define M0_ENTRY(...)
Definition: trace.h:170
static struct m0_sns_cm_ag * sag
Definition: cm.c:66
M0_INTERNAL bool m0_sns_cm_is_cob_repairing(struct m0_poolmach *pm, uint32_t cob_index)
Definition: cm_utils.c:256
int i
Definition: dir.c:1033
#define M0_ERR_INFO(rc, fmt,...)
Definition: trace.h:215
static int repair_cob_locate(struct m0_sns_cm *scm, struct m0_cob_domain *cdom, struct m0_poolmach *pm, const struct m0_fid *cob_fid)
Definition: helpers.c:209
return M0_ERR(-EOPNOTSUPP)
const struct m0_sns_cm_helpers repair_helpers
Definition: helpers.c:238
enum m0_proxy_state px_status
Definition: proxy.h:91
const char * px_endpoint
Definition: proxy.h:118
m0_pool_nd_state
Definition: pool_machine.h:57
M0_INTERNAL int m0_sns_cm_cob_locate(struct m0_cob_domain *cdom, const struct m0_fid *cob_fid)
Definition: cm_utils.c:157
#define m0_streq(a, b)
Definition: string.h:34
static struct m0_fid cob_fid
Definition: net.c:116
M0_INTERNAL struct m0_pdclust_layout * m0_layout_to_pdl(const struct m0_layout *l)
Definition: pdclust.c:382
M0_INTERNAL bool m0_sns_cm_is_cob_repaired(struct m0_poolmach *pm, uint32_t cob_index)
Definition: cm_utils.c:246
M0_INTERNAL void m0_bitmap_set(struct m0_bitmap *map, size_t idx, bool val)
Definition: bitmap.c:139
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
M0_INTERNAL void m0_sns_cm_fctx_lock(struct m0_sns_cm_file_ctx *fctx)
Definition: file.c:53
uint64_t px_id
Definition: proxy.h:63
static bool repair_ag_is_relevant(struct m0_sns_cm *scm, struct m0_sns_cm_file_ctx *fctx, uint64_t group)
Definition: helpers.c:153
M0_INTERNAL uint64_t m0_sns_cm_ag_nr_spare_units(const struct m0_pdclust_layout *pl)
Definition: cm_utils.c:234
uint32_t p_nr
Definition: proxy.h:152
uint64_t sa_unit
Definition: pdclust.h:243
uint64_t cm_proxy_nr
Definition: cm.h:250
char * ep
Definition: sw.h:132
#define M0_CNT_INC(cnt)
Definition: arith.h:226
Definition: fid.h:38
M0_INTERNAL uint64_t m0_sns_cm_ag_size(const struct m0_pdclust_layout *pl)
Definition: cm_utils.c:239
static int repair_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: helpers.c:37
static struct m0_net_test_service svc
Definition: service.c:34
Definition: cm.h:166
M0_INTERNAL bool m0_bitmap_get(const struct m0_bitmap *map, size_t idx)
Definition: bitmap.c:105
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
M0_INTERNAL void m0_confc_close(struct m0_conf_obj *obj)
Definition: confc.c:921
Definition: rwlock.c:42
struct m0_cm sc_base
Definition: cm.h:206
struct m0_pdclust_instance * sf_pi
Definition: file.h:77
static struct m0_sns_cm_file_ctx fctx
Definition: net.c:55
struct m0_fid gfid
Definition: dir.c:626
#define m0_tl_find(name, var, head,...)
Definition: tlist.h:757
static uint64_t repair_ag_unit_end(const struct m0_pdclust_layout *pl)
Definition: helpers.c:148
bool(* sch_is_cob_failed)(struct m0_poolmach *pm, uint32_t cob_index)
Definition: cm.h:188
const struct m0_sns_cm_helpers * sc_helpers
Definition: cm.h:215
int32_t rc
Definition: trigger_fop.h:47
static uint64_t repair_ag_unit_start(const struct m0_pdclust_layout *pl)
Definition: helpers.c:143
Definition: ag.h:49