Motr  M0
repair_main.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 <sys/stat.h>
27 #include <stdlib.h>
28 
29 #include "lib/errno.h"
30 #include "lib/assert.h"
31 #include "lib/getopts.h"
32 #include "lib/misc.h" /* M0_IN */
33 #include "lib/memory.h"
34 #include "lib/time.h"
35 #include "lib/atomic.h"
36 
37 #include "fop/fop.h"
38 #include "motr/init.h"
39 #include "module/instance.h" /* m0 */
40 
41 #include "rpc/rpclib.h"
42 #include "rpc/rpc_opcodes.h"
43 
44 #include "sns/cm/cm.h"
45 #include "sns/cm/trigger_fop.h"
46 #include "dix/cm/cm.h"
47 #include "dix/cm/trigger_fop.h"
48 #include "cm/repreb/trigger_fop.h"
49 #include "cm/repreb/trigger_fop_xc.h"
50 
51 #include "repair_cli.h"
52 
55 int32_t srv_cnt = 0;
57 enum {
59 };
60 extern struct m0_rpc_client_ctx cl_ctx;
61 
62 extern const char *cl_ep_addr;
63 extern const char *srv_ep_addr[MAX_SERVERS];
64 
71 
78 
79 static void usage(void)
80 {
81  fprintf(stdout,
82 "-O Operation: CM_OP_REPAIR = 2 or CM_OP_REBALANCE = 4\n"
83 " CM_OP_REPAIR_QUIESCE = 8 or CM_OP_REBALANCE_QUIESCE = 16\n"
84 " CM_OP_REPAIR_STATUS = 32 or CM_OP_REBALANCE_STATUS = 64\n"
85 "-C Client_end_point\n"
86 "-S Server_end_point [-S Server_end_point ]: max number is %d\n"
87 "-t Service type: \n"
88 " SNS = 0 or\n"
89 " DIX = 1\n", MAX_SERVERS);
90 }
91 
93 {
94  uint32_t req_op;
95  struct trigger_fop *treq;
96  struct m0_fop *req_fop;
97  struct m0_fop *rep_fop;
98  struct trigger_rep_fop *trep;
99  struct m0_status_rep_fop *srep;
100 
102 
103  req_fop = m0_rpc_item_to_fop(item);
104  treq = m0_fop_data(req_fop);
105  req_op = treq->op;
106 
108  trep = m0_fop_data(rep_fop);
109  printf("reply got from: %s: op=%d rc=%d",
110  m0_rpc_item_remote_ep_addr(&rep_fop->f_item), req_op, trep->rc);
111  if (req_op == CM_OP_REPAIR_STATUS || req_op == CM_OP_REBALANCE_STATUS) {
112  srep = m0_fop_data(rep_fop);
113  printf(" status=%d progress=%" PRIu64 "\n", srep->ssr_state,
114  srep->ssr_progress);
115  } else {
116  printf("\n");
117  }
120 }
121 
122 static const struct m0_rpc_item_ops repair_item_ops = {
124 };
125 
126 int main(int argc, char *argv[])
127 {
128  static struct m0 instance;
129 
130  struct trigger_fop *treq;
131  struct rpc_ctx *ctxs;
132  struct m0_rpc_session *session;
133  struct m0_clink repair_clink;
135  m0_time_t delta;
136  int rc;
137  uint32_t type = 0;
138  uint32_t op;
139  int i;
140 
141  rc = m0_init(&instance);
142  if (rc != 0) {
143  fprintf(stderr, "Cannot init Motr: %d\n", rc);
144  return M0_ERR(rc);
145  }
146 
147  if (argc <= 1) {
148  usage();
149  return M0_ERR(-EINVAL);
150  }
151 
152  rc = M0_GETOPTS("repair", argc, argv,
153  M0_FORMATARG('O',
154  "-O Operation: \n"
155  "\t\t\tCM_OP_REPAIR = 1 or\n"
156  "\t\t\tCM_OP_REBALANCE = 2 or\n"
157  "\t\t\tCM_OP_REPAIR_QUIESCE = 3 or\n"
158  "\t\t\tCM_OP_REBALANCE_QUIESCE = 4 or\n"
159  "\t\t\tCM_OP_REPAIR_RESUME = 5 or\n"
160  "\t\t\tCM_OP_REBALANCE_RESUME = 6 or\n"
161  "\t\t\tCM_OP_REPAIR_STATUS = 7 or\n"
162  "\t\t\tCM_OP_REBALANCE_STATUS = 8 or\n"
163  "\t\t\tCM_OP_REPAIR_ABORT = 9 or\n"
164  "\t\t\tCM_OP_REBALANCE_ABORT = 10\n",
165  "%u", &op),
166  M0_STRINGARG('C', "Client endpoint",
167  LAMBDA(void, (const char *str){
168  cl_ep_addr = str;
169  })),
170  M0_STRINGARG('S', "Server endpoint",
171  LAMBDA(void, (const char *str){
172  srv_ep_addr[srv_cnt] = str;
173  ++srv_cnt;
174  })),
175  M0_FORMATARG('t',
176  "Service type: \n"
177  "\t\t\tSNS = 0 or\n"
178  "\t\t\tDIX = 1\n",
179  "%u", &type),
180  M0_HELPARG('h'),
181  );
182 
183  if (rc != 0)
184  return M0_ERR(rc);
185 
187  !M0_IN(type, (0, 1))) {
188  usage();
189  return M0_ERR(-EINVAL);
190  }
191 
198  if (rc != 0)
199  return M0_ERR(rc);
200 
203  m0_clink_init(&repair_clink, NULL);
204  M0_ALLOC_ARR(ctxs, srv_cnt);
205  M0_ASSERT(ctxs != NULL);
206  for (i = 0; i < srv_cnt; ++i) {
207  rc = repair_rpc_ctx_init(&ctxs[i], srv_ep_addr[i]);
208  ctxs[i].ctx_rc = rc;
209  if (rc != 0)
210  printf("failed to connect to %s: %d\n",
211  srv_ep_addr[i], rc);
212  }
214  m0_clink_add(&repair_wait, &repair_clink);
216  start = m0_time_now();
217  for (i = 0; i < srv_cnt; ++i) {
218  struct m0_rpc_machine *mach;
219  struct m0_fop *fop = NULL;
220  struct m0_rpc_item *item;
221 
222  if (ctxs[i].ctx_rc != 0) {
224  continue;
225  }
226  session = &ctxs[i].ctx_session;
228  if (type == 0)
230  else
232  if (rc != 0)
233  return M0_ERR(rc);
234 
235  treq = m0_fop_data(fop);
236  treq->op = op;
237 
242  item->ri_deadline = 0;
243  rc = m0_rpc_post(item);
245  if (rc != 0)
246  return M0_ERR(rc);
247  printf("trigger fop sent to %s\n", srv_ep_addr[i]);
248  }
249 
250  m0_chan_wait(&repair_clink);
251 
252  delta = m0_time_sub(m0_time_now(), start);
253  printf("Time: %lu.%2.2lu sec\n", (unsigned long)m0_time_seconds(delta),
254  (unsigned long)(m0_time_nanoseconds(delta) * 100 /
256  for (i = 0; i < srv_cnt; ++i)
257  repair_rpc_ctx_fini(&ctxs[i]);
263  m0_fini();
264 
265  return M0_RC(rc);
266 }
267 
268 #undef M0_TRACE_SUBSYSTEM
269 
270 /*
271  * Local variables:
272  * c-indentation-style: "K&R"
273  * c-basic-offset: 8
274  * tab-width: 8
275  * fill-column: 80
276  * scroll-step: 1
277  * End:
278  */
#define M0_GETOPTS(progname, argc, argv,...)
Definition: getopts.h:169
M0_INTERNAL int repair_rpc_ctx_init(struct rpc_ctx *ctx, const char *sep)
Definition: repair_cli.c:62
M0_INTERNAL int m0_rpc_post(struct m0_rpc_item *item)
Definition: rpc.c:63
M0_INTERNAL void m0_dix_cm_rebalance_trigger_fop_init(void)
Definition: trigger_fop.c:63
struct m0_mutex repair_wait_mutex
Definition: repair_main.c:53
M0_INTERNAL void m0_chan_wait(struct m0_clink *link)
Definition: chan.c:336
struct m0_fop_type m0_sns_rebalance_status_fopt
struct m0_fop_type m0_dix_rebalance_quiesce_fopt
#define M0_ALLOC_ARR(arr, nr)
Definition: memory.h:84
M0_INTERNAL void m0_mutex_unlock(struct m0_mutex *mutex)
Definition: mutex.c:66
enum m0_rpc_item_priority ri_prio
Definition: item.h:133
#define NULL
Definition: misc.h:38
M0_INTERNAL void m0_clink_init(struct m0_clink *link, m0_chan_cb_t cb)
Definition: chan.c:201
int32_t srv_cnt
Definition: repair_main.c:55
void m0_fini(void)
Definition: init.c:318
M0_INTERNAL int m0_sns_cm_trigger_fop_alloc(struct m0_rpc_machine *mach, uint32_t op, struct m0_fop **fop)
M0_INTERNAL void m0_dix_cm_repair_trigger_fop_init(void)
Definition: trigger_fop.c:63
uint64_t m0_time_t
Definition: time.h:37
M0_INTERNAL void m0_dix_cm_repair_trigger_fop_fini(void)
Definition: trigger_fop.c:45
M0_INTERNAL void m0_sns_cm_rebalance_trigger_fop_init(void)
Definition: trigger_fop.c:54
uint64_t m0_time_nanoseconds(const m0_time_t time)
Definition: time.c:89
void * m0_fop_data(const struct m0_fop *fop)
Definition: fop.c:220
static struct m0_addb2_mach * mach
Definition: storage.c:42
int m0_init(struct m0 *instance)
Definition: init.c:310
static struct m0_rpc_session session
Definition: formation2.c:38
M0_INTERNAL void m0_mutex_lock(struct m0_mutex *mutex)
Definition: mutex.c:49
int main(int argc, char *argv[])
Definition: repair_main.c:126
static struct m0_rpc_item * item
Definition: item.c:56
uint32_t op
Definition: trigger_fop.h:52
uint64_t ssr_progress
Definition: trigger_fop.h:62
return M0_RC(rc)
op
Definition: libdemo.c:64
M0_INTERNAL void m0_sns_cm_repair_trigger_fop_init(void)
Definition: trigger_fop.c:55
#define M0_STRINGARG(ch, desc, func)
Definition: getopts.h:207
int i
Definition: dir.c:1033
#define PRIu64
Definition: types.h:58
return M0_ERR(-EOPNOTSUPP)
#define LAMBDA(T,...)
Definition: thread.h:153
#define M0_FORMATARG(ch, desc, fmt, ptr)
Definition: getopts.h:218
M0_INTERNAL void m0_chan_init(struct m0_chan *chan, struct m0_mutex *ch_guard)
Definition: chan.c:96
M0_INTERNAL void repair_rpc_ctx_fini(struct rpc_ctx *ctx)
Definition: repair_cli.c:71
#define M0_ASSERT(cond)
struct m0_fop_type m0_sns_repair_status_fopt
m0_time_t m0_time_now(void)
Definition: time.c:134
static void usage(void)
Definition: repair_main.c:79
struct m0_rpc_machine * m0_fop_session_machine(const struct m0_rpc_session *s)
Definition: fop.c:453
static void m0_atomic64_dec(struct m0_atomic64 *a)
struct m0_atomic64 srv_rep_cnt
Definition: repair_main.c:56
struct m0_fop_type m0_sns_repair_quiesce_fopt
Definition: instance.h:80
static const struct m0_rpc_item_ops repair_item_ops
Definition: repair_main.c:122
struct m0_fop_type m0_sns_rebalance_quiesce_fopt
struct m0_rpc_item * ri_reply
Definition: item.h:163
M0_INTERNAL void m0_mutex_init(struct m0_mutex *mutex)
Definition: mutex.c:35
struct m0_fop_type m0_dix_rebalance_status_fopt
struct m0_rpc_session ctx_session
Definition: pool_trigger.c:59
Definition: chan.h:229
static bool m0_atomic64_dec_and_test(struct m0_atomic64 *a)
const char * cl_ep_addr
Definition: repair_cli.c:39
struct m0_fop_type m0_dix_repair_trigger_fopt
uint64_t m0_time_seconds(const m0_time_t time)
Definition: time.c:83
M0_INTERNAL void m0_chan_signal_lock(struct m0_chan *chan)
Definition: chan.c:165
struct m0_fop_type m0_dix_repair_status_fopt
void(* rio_replied)(struct m0_rpc_item *item)
Definition: item.h:300
struct m0_fop_type m0_dix_rebalance_trigger_fopt
int32_t m0_rpc_item_error(const struct m0_rpc_item *item)
Definition: item.c:973
M0_INTERNAL void m0_sns_cm_rebalance_trigger_fop_fini(void)
Definition: trigger_fop.c:42
uint32_t ssr_state
Definition: trigger_fop.h:61
M0_INTERNAL void m0_clink_add(struct m0_chan *chan, struct m0_clink *link)
Definition: chan.c:228
const struct m0_rpc_item_ops * ri_ops
Definition: item.h:149
m0_time_t m0_time_sub(const m0_time_t t1, const m0_time_t t2)
Definition: time.c:65
const char * srv_ep_addr[MAX_SERVERS]
Definition: repair_cli.c:40
struct m0_rpc_session * ri_session
Definition: item.h:147
struct m0_rpc_item * m0_fop_to_rpc_item(const struct m0_fop *fop)
Definition: fop.c:338
#define M0_HELPARG(ch)
Definition: getopts.h:242
M0_INTERNAL void repair_client_fini(void)
Definition: repair_cli.c:55
struct m0_fop_type m0_dix_repair_quiesce_fopt
static int start(struct m0_fom *fom)
Definition: trigger_fom.c:321
void m0_fop_put_lock(struct m0_fop *fop)
Definition: fop.c:199
static struct m0_fop * fop
Definition: item.c:57
static struct m0 instance
Definition: main.c:78
struct m0_fop * m0_rpc_item_to_fop(const struct m0_rpc_item *item)
Definition: fop.c:346
struct m0_fop_type m0_sns_rebalance_trigger_fopt
M0_INTERNAL void m0_dix_cm_rebalance_trigger_fop_fini(void)
Definition: trigger_fop.c:45
M0_INTERNAL int m0_dix_cm_trigger_fop_alloc(struct m0_rpc_machine *mach, uint32_t op, struct m0_fop **fop)
struct m0_fop_type m0_sns_repair_trigger_fopt
int type
Definition: dir.c:1031
Definition: mutex.h:47
int ctx_rc
Definition: repair_cli.h:39
struct m0_rpc_item f_item
Definition: fop.h:83
static void repair_reply_received(struct m0_rpc_item *item)
Definition: repair_main.c:92
M0_INTERNAL void m0_sns_cm_repair_trigger_fop_fini(void)
Definition: trigger_fop.c:43
int32_t rc
Definition: trigger_fop.h:47
struct m0_chan repair_wait
Definition: repair_main.c:54
Definition: fop.h:79
static void m0_atomic64_set(struct m0_atomic64 *a, int64_t num)
struct m0_fop * rep_fop
Definition: dir.c:334
M0_INTERNAL const char * m0_rpc_item_remote_ep_addr(const struct m0_rpc_item *item)
Definition: item.c:1188
m0_time_t ri_deadline
Definition: item.h:141
M0_INTERNAL int repair_client_init(void)
Definition: repair_cli.c:42