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/assert.h"
27 #include "lib/errno.h"
28 #include "lib/memory.h"
29 
30 #include "fop/fop.h"
31 #include "reqh/reqh.h"
32 #include "conf/obj_ops.h" /* m0_conf_obj_find_lock */
33 
34 #include "sns/cm/cm_utils.h"
35 #include "sns/cm/iter.h"
36 #include "sns/cm/cm.h"
37 #include "sns/cm/cp.h"
38 #include "sns/cm/file.h"
39 #include "sns/cm/rebalance/ag.h"
40 
41 /* Import */
42 struct m0_cm_sw;
43 
44 extern const struct m0_sns_cm_helpers rebalance_helpers;
45 extern const struct m0_cm_cp_ops m0_sns_cm_rebalance_cp_ops;
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 *rebalance_cm_cp_alloc(struct m0_cm *cm)
55 {
56  struct m0_sns_cm_cp *scp;
57 
59  if (scp == NULL)
60  return NULL;
62  return &scp->sc_base;
63 }
64 
65 static int rebalance_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 
75  if (rc == 0)
77 
78  return M0_RC(rc);
79 
80 }
81 
82 static void rebalance_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 rebalanced. */
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_ONLINE;
119  m0_tl_for(pool_failed_devs, &pool->po_failed_devices, pd) {
120  if (pd->pd_state == M0_PNDS_SNS_REBALANCING) {
121  dstate = M0_NC_ONLINE;
123  &disk_obj);
124  M0_ASSERT(rc == 0);
125  disk = M0_CONF_CAST(disk_obj, m0_conf_drive);
126  M0_ASSERT(disk != NULL);
128  true) ||
129  m0_cm_is_dirty(cm)) {
130  dstate = M0_NC_REBALANCE;
131  pstate = M0_NC_REBALANCE;
132  }
133  nvec.nv_note[i].no_id = disk_obj->co_id;
134  nvec.nv_note[i].no_state = dstate;
135  M0_CNT_INC(i);
136  }
137  } m0_tl_endfor;
138  /* Set pool ha note. */
139  nvec.nv_note[i].no_id = pool->po_id;
140  nvec.nv_note[i].no_state = pstate;
141  m0_ha_local_state_set(&nvec);
142  m0_free(nvec.nv_note);
143  i = 0;
144  } m0_tl_endfor;
145 
146 out:
148  M0_LEAVE();
149 }
150 
161  const struct m0_cm_ag_id *id,
162  size_t *count)
163 {
164  struct m0_sns_cm *scm = cm2sns(cm);
165  struct m0_pdclust_layout *pl;
166  struct m0_fid fid;
167  struct m0_sns_cm_file_ctx *fctx;
168  int64_t tot_inbufs;
169 
170  M0_PRE(cm != NULL && id != NULL);
172 
173  agid2fid(id, &fid);
177  M0_ASSERT(fctx != NULL);
179  tot_inbufs = m0_sns_cm_incoming_reserve_bufs(scm, id);
180  if (tot_inbufs <= 0)
181  return -ENOENT;
182  *count = tot_inbufs;
183  return m0_sns_cm_has_space_for(scm, pl, tot_inbufs);
184 }
185 
187 const struct m0_cm_ops sns_rebalance_ops = {
189  .cmo_prepare = rebalance_cm_prepare,
190  .cmo_start = m0_sns_cm_start,
191  .cmo_ag_alloc = m0_sns_cm_rebalance_ag_alloc,
192  .cmo_cp_alloc = rebalance_cm_cp_alloc,
193  .cmo_data_next = m0_sns_cm_iter_next,
194  .cmo_ag_next = m0_sns_cm_ag_next,
195  .cmo_get_space_for = rebalance_cm_get_space_for,
196  .cmo_sw_onwire_fop_setup = m0_sns_cm_rebalance_sw_onwire_fop_setup,
197  .cmo_is_peer = m0_sns_is_peer,
198  .cmo_ha_msg = m0_sns_cm_ha_msg,
199  .cmo_stop = rebalance_cm_stop,
200  .cmo_fini = m0_sns_cm_fini
201 };
202 
203 #undef M0_TRACE_SUBSYSTEM
204 
206 /*
207  * Local variables:
208  * c-indentation-style: "K&R"
209  * c-basic-offset: 8
210  * tab-width: 8
211  * fill-column: 80
212  * scroll-step: 1
213  * End:
214  */
struct m0_fid co_id
Definition: obj.h:208
static struct ctx cc
Definition: cm.h:205
#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
const struct m0_sns_cm_helpers rebalance_helpers
Definition: helpers.c:356
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 rebalance_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
const struct m0_cm_ops sns_rebalance_ops
Definition: cm.c:187
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
M0_INTERNAL void m0_mutex_lock(struct m0_mutex *mutex)
Definition: mutex.c:49
static m0_bcount_t count
Definition: xcode.c:167
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
#define M0_ENTRY(...)
Definition: trace.h:170
enum m0_cm_op sc_op
Definition: cm.h:209
M0_INTERNAL void m0_sns_cm_ha_msg(struct m0_cm *cm, struct m0_ha_msg *msg, int rc)
Definition: cm.c:756
int i
Definition: dir.c:1033
struct m0_cm_cp sc_base
Definition: cp.h:39
struct m0_mutex sc_file_ctx_mutex
Definition: cm.h:271
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_ha_obj_state
Definition: note.h:119
const struct m0_cm_cp_ops m0_sns_cm_rebalance_cp_ops
Definition: cp.c:446
const struct m0_cm_cp_ops * c_ops
Definition: cp.h:169
struct m0_conf_cache cc_cache
Definition: confc.h:394
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
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
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
static struct m0_cm_cp * rebalance_cm_cp_alloc(struct m0_cm *cm)
Definition: cm.c:54
M0_INTERNAL bool m0_fid_eq(const struct m0_fid *fid0, const struct m0_fid *fid1)
Definition: fid.c:164
M0_INTERNAL bool m0_sns_is_peer(struct m0_cm *cm, struct m0_reqh_service_ctx *ctx)
Definition: cm.c:542
#define M0_CNT_INC(cnt)
Definition: arith.h:226
Definition: fid.h:38
static struct m0_sns_cm_cp scp
Definition: cm.c:65
#define M0_ALLOC_PTR(ptr)
Definition: memory.h:86
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
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_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
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
#define out(...)
Definition: gen.c:41
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_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
static int rebalance_cm_get_space_for(struct m0_cm *cm, const struct m0_cm_ag_id *id, size_t *count)
Definition: cm.c:160
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
static void rebalance_cm_stop(struct m0_cm *cm)
Definition: cm.c:82
M0_INTERNAL int m0_sns_cm_rebalance_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:107
M0_INTERNAL int m0_sns_cm_rebalance_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 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