Motr  M0
cm.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/assert.h"
27 #include "lib/errno.h"
28 
29 #include "fop/fop.h"
30 #include "reqh/reqh.h"
31 #include "conf/obj_ops.h" /* m0_conf_obj_find_lock */
32 
33 #include "sns/cm/cm_utils.h"
34 #include "sns/cm/iter.h"
35 #include "sns/cm/cm.h"
36 #include "sns/cm/cp.h"
37 #include "sns/cm/file.h"
38 #include "sns/cm/repair/ag.h"
39 
40 /* Import */
41 struct m0_cm_sw;
42 
43 extern const struct m0_sns_cm_helpers repair_helpers;
44 extern const struct m0_cm_cp_ops m0_sns_cm_repair_cp_ops;
45 extern struct m0_cm_type sns_repair_cmt;
46 
47 M0_INTERNAL int
49  void (*fop_release)(struct m0_ref *),
50  uint64_t proxy_id, const char *local_ep,
51  const struct m0_cm_sw *sw,
52  const struct m0_cm_sw *out_interval);
53 
54 static struct m0_cm_cp *repair_cm_cp_alloc(struct m0_cm *cm)
55 {
56  struct m0_cm_cp *cp;
57 
58  cp = m0_sns_cm_cp_alloc(cm);
59  if (cp != NULL)
61 
62  return cp;
63 }
64 
65 static int repair_cm_prepare(struct m0_cm *cm)
66 {
67  struct m0_sns_cm *scm = cm2sns(cm);
68  int rc;
69 
70  M0_ENTRY("cm: %p", cm);
72 
74 
76  if (rc == 0)
78 
79  return M0_RC(rc);
80 }
81 
82 static void repair_cm_stop(struct m0_cm *cm)
83 {
84  struct m0_sns_cm *scm = cm2sns(cm);
86  struct m0_pool *pool;
87  struct m0_pooldev *pd;
88  struct m0_conf_obj *disk_obj;
89  struct m0_conf_drive *disk;
90  struct m0_conf_cache *cc;
91  struct m0_ha_nvec nvec;
92  enum m0_ha_obj_state dstate;
93  enum m0_ha_obj_state pstate;
94  int i = 0;
95  int rc;
96 
97  M0_ENTRY();
99 
100  cc = &pc->pc_confc->cc_cache;
101  m0_tl_for(pools, &pc->pc_pools, pool) {
102  /* Skip mdpool, since only io pools are repaired. */
103  if (m0_fid_eq(&pc->pc_md_pool->po_id, &pool->po_id) ||
104  (pc->pc_dix_pool != NULL &&
106  continue;
108  &nvec);
109  if (rc != 0) {
110  M0_LOG(M0_DEBUG, "HA note allocation for pool"FID_F
111  "failed with rc: %d",
112  FID_P(&pool->po_id), rc);
113  if (rc == -ENOENT)
114  continue;
115  M0_LOG(M0_ERROR, "HA note allocation failed with rc: %d", rc);
116  goto out;
117  }
118  pstate = M0_NC_REPAIRED;
119  m0_tl_for(pool_failed_devs, &pool->po_failed_devices, pd) {
120  if (pd->pd_state == M0_PNDS_SNS_REPAIRING) {
121  dstate = M0_NC_REPAIRED;
123  &disk_obj);
124  M0_ASSERT(rc == 0);
125  disk = M0_CONF_CAST(disk_obj, m0_conf_drive);
126  M0_ASSERT(disk != NULL);
129  true) ||
130  m0_cm_is_dirty(cm)) {
131  dstate = M0_NC_REPAIR;
132  pstate = M0_NC_REPAIR;
133  }
134  nvec.nv_note[i].no_id = disk_obj->co_id;
135  nvec.nv_note[i].no_state = dstate;
136  M0_CNT_INC(i);
137  }
138  } m0_tl_endfor;
139  /* Set pool ha note. */
140  nvec.nv_note[i].no_id = pool->po_id;
141  nvec.nv_note[i].no_state = pstate;
142  m0_ha_local_state_set(&nvec);
143  m0_free(nvec.nv_note);
144  i = 0;
145  } m0_tl_endfor;
146 out:
147 
149  M0_LEAVE();
150 }
151 
160 static int repair_cm_get_space_for(struct m0_cm *cm, const struct m0_cm_ag_id *id,
161  size_t *count)
162 {
163  struct m0_sns_cm *scm = cm2sns(cm);
164  struct m0_fid fid;
165  struct m0_sns_cm_file_ctx *fctx;
166  struct m0_pdclust_layout *pl;
167  int64_t total_inbufs;
168 
169  M0_PRE(cm != NULL && id != NULL);
171 
172  agid2fid(id, &fid);
176  M0_ASSERT(fctx != NULL);
178  total_inbufs = m0_sns_cm_repair_ag_inbufs(scm, fctx, id);
179  if (total_inbufs > 0) {
180  *count = total_inbufs;
181  return m0_sns_cm_has_space_for(scm, pl, total_inbufs);
182  }
183  return M0_RC((int)total_inbufs);
184 }
185 
186 M0_INTERNAL enum sns_repair_state
188  enum m0_pool_nd_state device_state)
189 {
190  struct m0_sns_cm *scm;
191  struct m0_cm *cm;
192  struct m0_reqh_service *service;
193  struct m0_fid curr_gfid;
194 
196  M0_PRE(reqh != NULL);
197 
199  M0_ASSERT(service != NULL);
200 
201  cm = container_of(service, struct m0_cm, cm_service);
202  scm = cm2sns(cm);
203 
204  M0_SET0(&curr_gfid);
205  switch (device_state) {
207  return SRS_REPAIR_DONE;
209  m0_cm_lock(cm);
210  curr_gfid = scm->sc_it.si_fc.ifc_gfid;
211  m0_cm_unlock(cm);
212  if (curr_gfid.f_container == 0 && curr_gfid.f_key == 0)
213  break;
214  return m0_fid_cmp(gfid, &curr_gfid) > 0 ? SRS_REPAIR_NOTDONE :
217  return SRS_REPAIR_NOTDONE;
218  default:
219  return SRS_UNINITIALIZED;
220  }
221 
222  return SRS_UNINITIALIZED;
223 }
224 
226 M0_INTERNAL const struct m0_cm_ops sns_repair_ops = {
228  .cmo_prepare = repair_cm_prepare,
229  .cmo_start = m0_sns_cm_start,
230  .cmo_ag_alloc = m0_sns_cm_repair_ag_alloc,
231  .cmo_cp_alloc = repair_cm_cp_alloc,
232  .cmo_data_next = m0_sns_cm_iter_next,
233  .cmo_ag_next = m0_sns_cm_ag_next,
234  .cmo_get_space_for = repair_cm_get_space_for,
235  .cmo_sw_onwire_fop_setup = m0_sns_cm_repair_sw_onwire_fop_setup,
236  .cmo_is_peer = m0_sns_is_peer,
237  .cmo_ha_msg = m0_sns_cm_ha_msg,
238  .cmo_stop = repair_cm_stop,
239  .cmo_fini = m0_sns_cm_fini
240 };
241 
242 #undef M0_TRACE_SUBSYSTEM
243 
245 /*
246  * Local variables:
247  * c-indentation-style: "K&R"
248  * c-basic-offset: 8
249  * tab-width: 8
250  * fill-column: 80
251  * scroll-step: 1
252  * End:
253  */
struct m0_fid co_id
Definition: obj.h:208
static struct ctx cc
sns_repair_state
Definition: pool.h:568
Definition: cm.h:205
M0_INTERNAL void m0_cm_lock(struct m0_cm *cm)
Definition: cm.c:545
#define M0_PRE(cond)
M0_INTERNAL void m0_mutex_unlock(struct m0_mutex *mutex)
Definition: mutex.c:66
M0_INTERNAL void agid2fid(const struct m0_cm_ag_id *id, struct m0_fid *fid)
Definition: ag.c:405
M0_INTERNAL bool m0_cm_is_dirty(struct m0_cm *cm)
Definition: cm.c:1193
Definition: sw.h:45
#define NULL
Definition: misc.h:38
struct m0_pool * pc_dix_pool
Definition: pool.h:237
M0_INTERNAL struct m0_sns_cm * cm2sns(struct m0_cm *cm)
Definition: cm.c:389
static int repair_cm_prepare(struct m0_cm *cm)
Definition: cm.c:65
#define M0_LOG(level,...)
Definition: trace.h:167
Definition: cp.h:160
M0_LEAVE()
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
void fop_release(struct m0_ref *ref)
Definition: stats_ut_svc.c:148
struct m0_layout * sf_layout
Definition: file.h:74
static struct m0_sns_cm * scm
Definition: cm.c:64
struct m0_pool * pc_md_pool
Definition: pool.h:212
M0_INTERNAL int m0_sns_cm_setup(struct m0_cm *cm)
Definition: cm.c:487
#define container_of(ptr, type, member)
Definition: misc.h:33
#define M0_SET0(obj)
Definition: misc.h:64
M0_INTERNAL void m0_mutex_lock(struct m0_mutex *mutex)
Definition: mutex.c:49
M0_INTERNAL int m0_fid_cmp(const struct m0_fid *fid0, const struct m0_fid *fid1)
Definition: fid.c:170
M0_INTERNAL const struct m0_cm_ops sns_repair_ops
Definition: cm.c:226
static m0_bcount_t count
Definition: xcode.c:167
static struct m0_reqh_service * service
Definition: cm.c:62
static struct m0_pools_common pc
Definition: iter_ut.c:59
#define m0_tl_endfor
Definition: tlist.h:700
struct m0_fid fid
Definition: di.c:46
return M0_RC(rc)
static struct m0_cm * cm
Definition: cm.c:63
M0_INTERNAL void m0_cm_unlock(struct m0_cm *cm)
Definition: cm.c:550
#define M0_ENTRY(...)
Definition: trace.h:170
enum m0_cm_op sc_op
Definition: cm.h:209
static void repair_cm_stop(struct m0_cm *cm)
Definition: cm.c:82
M0_INTERNAL void m0_sns_cm_ha_msg(struct m0_cm *cm, struct m0_ha_msg *msg, int rc)
Definition: cm.c:756
const struct m0_cm_cp_ops m0_sns_cm_repair_cp_ops
Definition: cp.c:421
int i
Definition: dir.c:1033
M0_INTERNAL enum sns_repair_state m0_sns_cm_fid_repair_done(struct m0_fid *gfid, struct m0_reqh *reqh, enum m0_pool_nd_state device_state)
Definition: cm.c:187
struct m0_mutex sc_file_ctx_mutex
Definition: cm.h:271
const struct m0_sns_cm_helpers repair_helpers
Definition: helpers.c:238
M0_INTERNAL int m0_sns_cm_start(struct m0_cm *cm)
Definition: cm.c:641
Definition: refs.h:34
M0_INTERNAL void m0_sns_cm_stop(struct m0_cm *cm)
Definition: cm.c:716
#define M0_ASSERT(cond)
m0_pool_nd_state
Definition: pool_machine.h:57
struct m0_fid ifc_gfid
Definition: iter.h:51
m0_ha_obj_state
Definition: note.h:119
const struct m0_cm_cp_ops * c_ops
Definition: cp.h:169
struct m0_conf_cache cc_cache
Definition: confc.h:394
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 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 struct m0_pdclust_layout * m0_layout_to_pdl(const struct m0_layout *l)
Definition: pdclust.c:382
uint64_t f_container
Definition: fid.h:39
M0_INTERNAL int m0_conf_obj_find_lock(struct m0_conf_cache *cache, const struct m0_fid *id, struct m0_conf_obj **out)
Definition: obj_ops.c:154
Definition: reqh.h:94
struct m0_fid pd_id
Definition: pool.h:428
Definition: cm.h:286
#define M0_CONF_CAST(ptr, type)
Definition: obj.h:780
struct m0_confc * pc_confc
Definition: pool.h:164
#define FID_P(f)
Definition: fid.h:77
struct m0_fid no_id
Definition: note.h:180
static struct m0_pool pool
Definition: iter_ut.c:58
M0_INTERNAL int m0_sns_cm_iter_next(struct m0_cm *cm, struct m0_cm_cp *cp)
Definition: iter.c:762
M0_INTERNAL bool m0_fid_eq(const struct m0_fid *fid0, const struct m0_fid *fid1)
Definition: fid.c:164
Definition: cm.h:143
static struct m0_cm_cp * repair_cm_cp_alloc(struct m0_cm *cm)
Definition: cm.c:54
struct m0_sns_cm_iter_file_ctx si_fc
Definition: iter.h:101
M0_INTERNAL struct m0_reqh_service * m0_reqh_service_find(const struct m0_reqh_service_type *st, const struct m0_reqh *reqh)
Definition: reqh_service.c:538
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 int repair_cm_get_space_for(struct m0_cm *cm, const struct m0_cm_ag_id *id, size_t *count)
Definition: cm.c:160
#define M0_CNT_INC(cnt)
Definition: arith.h:226
Definition: fid.h:38
uint64_t f_key
Definition: fid.h:40
M0_INTERNAL int m0_sns_cm_pool_ha_nvec_alloc(struct m0_pool *pool, enum m0_pool_nd_state state, struct m0_ha_nvec *nvec)
Definition: cm_utils.c:585
static const char * local_ep(const struct m0_cm *cm)
Definition: cm_utils.c:397
struct m0_reqh_service cm_service
Definition: cm.h:191
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
struct m0_tl pc_pools
Definition: pool.h:162
int(* cmo_setup)(struct m0_cm *cm)
Definition: cm.h:292
struct m0_pools_common * rh_pools
Definition: reqh.h:118
static struct m0_fop * fop
Definition: item.c:57
M0_INTERNAL struct m0_sns_cm_file_ctx * m0_sns_cm_fctx_locate(struct m0_sns_cm *scm, struct m0_fid *fid)
Definition: file.c:441
struct m0_reqh_service_type ct_stype
Definition: cm.h:145
struct m0_fid po_id
Definition: pool.h:81
M0_INTERNAL int m0_sns_cm_fail_dev_log(struct m0_cm *cm, enum m0_pool_nd_state state)
Definition: cm.c:605
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
#define out(...)
Definition: gen.c:41
struct m0_fid gfid
Definition: dir.c:626
M0_INTERNAL void m0_sns_cm_fini(struct m0_cm *cm)
Definition: cm.c:773
struct m0_ha_note * nv_note
Definition: note.h:197
M0_INTERNAL bool m0_fid_is_valid(const struct m0_fid *fid)
Definition: fid.c:96
M0_INTERNAL int m0_sns_cm_repair_sw_onwire_fop_setup(struct m0_cm *cm, struct m0_fop *fop, void(*fop_release)(struct m0_ref *), uint64_t proxy_id, const char *local_ep, const struct m0_cm_sw *sw, const struct m0_cm_sw *out_interval)
Definition: sw_onwire_fop.c:88
M0_INTERNAL bool m0_cm_is_locked(const struct m0_cm *cm)
Definition: cm.c:560
struct m0_reqh * rs_reqh
Definition: reqh_service.h:259
#define m0_tl_for(name, head, obj)
Definition: tlist.h:695
void m0_free(void *data)
Definition: memory.c:146
const struct m0_sns_cm_helpers * sc_helpers
Definition: cm.h:215
int32_t rc
Definition: trigger_fop.h:47
M0_INTERNAL bool m0_sns_cm_disk_has_dirty_pver(struct m0_cm *cm, struct m0_conf_drive *disk, bool clear)
Definition: cm_utils.c:552
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
Definition: fop.h:79
#define FID_F
Definition: fid.h:75
M0_INTERNAL void m0_ha_local_state_set(const struct m0_ha_nvec *nvec)
Definition: note.c:105
uint32_t no_state
Definition: note.h:182
struct m0_tl po_failed_devices
Definition: pool.h:93