Motr  M0
link.c
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2014-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_RPC
24 #include "lib/errno.h"
25 #include "lib/memory.h" /* m0_free */
26 #include "lib/string.h" /* m0_strdup */
27 #include "lib/trace.h"
28 #include "lib/chan.h"
29 #include "lib/time.h"
30 #include "lib/misc.h"
31 #include "fop/fom.h"
32 #include "fop/fom_generic.h"
33 #include "net/net.h" /* m0_net_end_point */
34 #include "sm/sm.h"
35 #include "rpc/rpc_machine.h" /* m0_rpc_machine, m0_rpc_machine_lock */
36 #include "rpc/rpc_opcodes.h" /* M0_RPC_LINK_CONN_OPCODE */
37 #include "rpc/link.h"
38 #include "rpc/session_internal.h" /* m0_rpc_session_fini_locked */
39 #include "rpc/conn_internal.h" /* m0_rpc_conn_remove_session */
40 
47 #define CONN_STATE(conn) ((conn)->c_sm.sm_state)
48 #define CONN_RC(conn) ((conn)->c_sm.sm_rc)
49 #define CONN_CHAN(conn) ((conn)->c_sm.sm_chan)
50 
51 #define SESS_STATE(sess) ((sess)->s_sm.sm_state)
52 #define SESS_RC(sess) ((sess)->s_sm.sm_rc)
53 #define SESS_CHAN(sess) ((sess)->s_sm.sm_chan)
54 
61  const char *rlst_st_desc;
62 };
63 
64 typedef void (*rpc_link_cb_t)(struct m0_rpc_link*, m0_time_t, struct m0_clink*);
65 
66 static int rpc_link_conn_fom_tick(struct m0_fom *fom);
67 static void rpc_link_conn_fom_fini(struct m0_fom *fom);
68 static int rpc_link_disc_fom_tick(struct m0_fom *fom);
69 static void rpc_link_disc_fom_fini(struct m0_fom *fom);
70 static size_t rpc_link_fom_locality(const struct m0_fom *fom);
71 
72 static void rpc_link_conn_fom_wait_on(struct m0_fom *fom,
73  struct m0_rpc_link *rlink);
74 
77 
80  .fo_tick = rpc_link_conn_fom_tick,
81  .fo_home_locality = rpc_link_fom_locality
82 };
83 
86  .fo_tick = rpc_link_disc_fom_tick,
87  .fo_home_locality = rpc_link_fom_locality
88 };
89 
91  .fto_create = NULL,
92 };
93 
95  .fto_create = NULL,
96 };
97 
98 static size_t rpc_link_fom_locality(const struct m0_fom *fom)
99 {
100  return 1;
101 }
102 
103 /* Routines for connection */
104 
105 static int rpc_link_conn_establish(struct m0_rpc_link *rlink)
106 {
107  int rc;
108 
109  rc = m0_rpc_conn_establish(&rlink->rlk_conn, rlink->rlk_timeout);
110  if (rc != 0) {
111  M0_LOG(M0_ERROR, "Connection establish failed (rlink=%p)",
112  rlink);
113  }
114  return rc == 0 ? M0_FSO_AGAIN : rc;
115 }
116 
117 static int rpc_link_sess_establish(struct m0_rpc_link *rlink)
118 {
119  int rc;
120 
121  rc = m0_rpc_session_establish(&rlink->rlk_sess, rlink->rlk_timeout);
122  if (rc != 0)
123  M0_LOG(M0_ERROR, "Session establish failed (rlink=%p)", rlink);
124 
125  return rc == 0 ? M0_FSO_AGAIN : rc;
126 }
127 
128 static int rpc_link_sess_established(struct m0_rpc_link *rlink)
129 {
130  /*
131  * Rpc_link considered to be connected after fom is fini'ed. This avoids
132  * race when rlink->rlk_fom is used by m0_rpc_link_disconnect_async().
133  * @see rpc_link_conn_fom_fini()
134  */
135  return M0_FSO_WAIT;
136 }
137 
138 /* Routines for disconnection */
139 
140 static int rpc_link_disc_init(struct m0_rpc_link *rlink)
141 {
142  return M0_FSO_AGAIN;
143 }
144 
145 static int rpc_link_conn_terminate(struct m0_rpc_link *rlink)
146 {
147  int rc;
148 
149  rc = m0_rpc_conn_terminate(&rlink->rlk_conn, rlink->rlk_timeout);
150  if (rc == -ECANCELED)
151  return M0_FSO_AGAIN; /* no need to fail in the case */
152  if (rc != 0) {
153  M0_LOG(M0_ERROR, "Connection termination failed (rlink=%p)",
154  rlink);
155  }
156  return rc == 0 ? M0_FSO_AGAIN : rc;
157 }
158 
159 static int rpc_link_conn_terminated(struct m0_rpc_link *rlink)
160 {
162  return M0_FSO_WAIT;
163 }
164 
165 static int rpc_link_sess_terminate(struct m0_rpc_link *rlink)
166 {
167  int rc;
168 
170 
171  rc = m0_rpc_session_terminate(&rlink->rlk_sess, rlink->rlk_timeout);
172  if (rc == -ECANCELED)
173  return M0_FSO_AGAIN; /* continue normal way */
174  if (rc != 0) {
175  M0_LOG(M0_DEBUG, "Session termination failed (rlink=%p, rc=%d)",
176  rlink, rc);
177  }
178  return rc == 0 ? M0_FSO_AGAIN : rc;
179 }
180 
181 static void rpc_link_sess_cleanup(struct m0_rpc_link *rlink)
182 {
183  struct m0_rpc_session *sess = &rlink->rlk_sess;
184 
185  if (M0_IN(SESS_STATE(&rlink->rlk_sess), (M0_RPC_SESSION_INITIALISED,
187  return;
188  if (SESS_STATE(sess) != M0_RPC_SESSION_FAILED)
189  m0_rpc_session_cancel(sess);
190 }
191 
192 static int rpc_link_conn_failure(struct m0_rpc_link *rlink)
193 {
194  M0_PRE(rlink->rlk_rc != 0);
196  return M0_FSO_WAIT;
197 }
198 
199 static int rpc_link_sess_failure(struct m0_rpc_link *rlink)
200 {
201  M0_PRE(rlink->rlk_rc != 0);
202  /*
203  * Terminate connection even if session termination failed.
204  * We don't rewrite rlink->rlk_rc, therefore, ignore return code.
205  * M0_RPC_CONN_FAILED is handled by foms in M0_RLS_CONN_TERMINATING
206  * phase.
207  */
208  (void)rpc_link_conn_terminate(rlink);
209  return M0_FSO_AGAIN;
210 }
211 
213 
214  [M0_RLS_INIT] =
216  M0_RLS_CONN_FAILURE, "Initialised" },
217 
220  M0_RLS_SESS_FAILURE, "Connection establish" },
221 
223  { &rpc_link_sess_established, M0_RLS_FINI, 0, "Session establishing" },
224 
226  { &rpc_link_conn_failure, M0_RLS_FINI, 0, "Failure in connection" },
227 
230  "Failure in establishing session" },
231 
233  { &rpc_link_conn_failure, M0_RLS_FINI, 0, "terminate connection" },
234 
235 };
236 
238 
239  [M0_RLS_INIT] =
240  { &rpc_link_disc_init, M0_RLS_SESS_WAIT_IDLE, 0, "Initialised" },
241 
244  M0_RLS_SESS_FAILURE, "IDLE state wait" },
245 
248  M0_RLS_CONN_FAILURE, "Session termination" },
249 
251  { &rpc_link_conn_terminated, M0_RLS_FINI, 0, "Conn termination" },
252 
254  { &rpc_link_conn_failure, M0_RLS_FINI, 0, "Failure in disconnection" },
255 
258  "Failure in sess termination" },
259 };
260 
262  struct m0_rpc_link *rlink)
263 {
264  M0_SET0(&rlink->rlk_fomcb);
266  m0_fom_wait_on(fom, &CONN_CHAN(&rlink->rlk_conn), &rlink->rlk_fomcb);
267 }
268 
270  struct m0_rpc_link *rlink)
271 {
272  M0_SET0(&rlink->rlk_fomcb);
274  m0_fom_wait_on(fom, &SESS_CHAN(&rlink->rlk_sess), &rlink->rlk_fomcb);
275 }
276 
277 static int rpc_link_conn_fom_tick(struct m0_fom *fom)
278 {
279  int rc = 0;
280  int phase = m0_fom_phase(fom);
281  bool armed = false;
282  uint32_t state;
283  struct m0_rpc_link *rlink;
284  struct m0_rpc_machine *rpcmach;
285  enum m0_rpc_link_states fail_phase = M0_RLS_CONN_FAILURE;
286 
287  M0_ENTRY("fom=%p phase=%s", fom, m0_fom_phase_name(fom, phase));
288 
289  rlink = container_of(fom, struct m0_rpc_link, rlk_fom);
290  rpcmach = rlink->rlk_conn.c_rpc_machine;
291 
292  switch (phase) {
294  m0_rpc_machine_lock(rpcmach);
295  state = CONN_STATE(&rlink->rlk_conn);
296  M0_ASSERT(M0_IN(state, (M0_RPC_CONN_CONNECTING,
298  if (state == M0_RPC_CONN_FAILED) {
299  fail_phase = M0_RLS_CONN_FAILURE;
300  rc = CONN_RC(&rlink->rlk_conn);
301  }
302  if (state == M0_RPC_CONN_CONNECTING) {
304  armed = true;
305  rc = M0_FSO_WAIT;
306  }
307  m0_rpc_machine_unlock(rpcmach);
308  break;
310  m0_rpc_machine_lock(rpcmach);
311  state = SESS_STATE(&rlink->rlk_sess);
312  /*
313  * There might chances of some subsystem send item
314  * as soon as session established and it becomes idle.
315  * So M0_RPC_SESSION_BUSY state also possible.
316  */
321  if (state == M0_RPC_SESSION_FAILED) {
322  fail_phase = M0_RLS_SESS_FAILURE;
323  rc = SESS_RC(&rlink->rlk_sess);
324  }
325  if (state == M0_RPC_SESSION_ESTABLISHING) {
327  armed = true;
328  rc = M0_FSO_WAIT;
329  }
330  m0_rpc_machine_unlock(rpcmach);
331  break;
332  case M0_RLS_SESS_FAILURE:
333  /*
334  * We don't need machine lock here, it is done
335  * under machine lock down the stack in
336  * rpc_link_sess_cleanup().
337  */
338  rpc_link_sess_cleanup(rlink);
339  break;
341  m0_rpc_machine_lock(rpcmach);
342  state = CONN_STATE(&rlink->rlk_conn);
343  M0_ASSERT(M0_IN(state, (M0_RPC_CONN_TERMINATING,
346  /*
347  * No need to fail when state == M0_RPC_CONN_FAILED, because
348  * this is terminating path after session failure.
349  */
350  if (state == M0_RPC_CONN_TERMINATING) {
352  armed = true;
353  rc = M0_FSO_WAIT;
354  }
355  m0_rpc_machine_unlock(rpcmach);
356  break;
357  }
358 
359  if (rc == 0) {
360  rc = (*rpc_link_conn_states[phase].rlst_state_function)(rlink);
361  M0_ASSERT(rc != 0);
362  if (rc > 0) {
363  phase = rpc_link_conn_states[phase].rlst_next_phase;
364  m0_fom_phase_set(fom, phase);
365  } else
366  fail_phase = rpc_link_conn_states[phase].rlst_fail_phase;
367  }
368 
369  if (rc < 0) {
370  if (armed)
372  rlink->rlk_rc = rlink->rlk_rc ?: rc;
373  m0_fom_phase_set(fom, fail_phase);
374  rc = M0_FSO_AGAIN;
375  }
376  return M0_RC(rc);
377 }
378 
379 static int rpc_link_disc_fom_tick(struct m0_fom *fom)
380 {
381  int rc = 0;
382  int phase = m0_fom_phase(fom);
383  bool armed = false;
384  uint32_t state;
385  struct m0_rpc_link *rlink;
386  struct m0_rpc_machine *rpcmach;
387  enum m0_rpc_link_states fail_phase = M0_RLS_SESS_FAILURE;
388 
389  M0_ENTRY("fom=%p phase=%s", fom, m0_fom_phase_name(fom, phase));
390 
391  rlink = container_of(fom, struct m0_rpc_link, rlk_fom);
392  rpcmach = rlink->rlk_conn.c_rpc_machine;
393 
394  m0_rpc_machine_lock(rpcmach);
395 
396  switch (phase) {
398  state = SESS_STATE(&rlink->rlk_sess);
399  M0_ASSERT(M0_IN(state, (M0_RPC_SESSION_IDLE,
401 
402  if (state == M0_RPC_SESSION_FAILED)
403  rc = SESS_RC(&rlink->rlk_sess);
404 
405  if (state == M0_RPC_SESSION_BUSY) {
407  armed = true;
408  rc = M0_FSO_WAIT;
409  }
410  break;
412  state = SESS_STATE(&rlink->rlk_sess);
416 
417  if (state == M0_RPC_SESSION_FAILED)
418  rc = SESS_RC(&rlink->rlk_sess);
419 
420  if (state == M0_RPC_SESSION_TERMINATING) {
422  armed = true;
423  rc = M0_FSO_WAIT;
424  }
425  break;
427  state = CONN_STATE(&rlink->rlk_conn);
428  M0_ASSERT(M0_IN(state, (M0_RPC_CONN_TERMINATING,
431  if (state == M0_RPC_CONN_FAILED) {
432  fail_phase = M0_RLS_CONN_FAILURE;
433  rc = CONN_RC(&rlink->rlk_conn);
434  }
435  if (state == M0_RPC_CONN_TERMINATING) {
437  armed = true;
438  rc = M0_FSO_WAIT;
439  }
440  break;
441  }
442 
443  m0_rpc_machine_unlock(rpcmach);
444 
445  if (rc == 0) {
446  rc = (*rpc_link_disc_states[phase].rlst_state_function)(rlink);
447  M0_ASSERT(rc != 0);
448  if (rc > 0) {
449  phase = rpc_link_disc_states[phase].rlst_next_phase;
450  m0_fom_phase_set(fom, phase);
451  } else
452  fail_phase = rpc_link_disc_states[phase].rlst_fail_phase;
453  }
454 
455  if (rc < 0) {
456  if (armed)
458  rlink->rlk_rc = rlink->rlk_rc ?: rc;
459  m0_fom_phase_set(fom, fail_phase);
460  rc = M0_FSO_AGAIN;
461  }
462 
463  return M0_RC(rc);
464 }
465 
466 static void rpc_link_fom_fini_common(struct m0_fom *fom, bool connected)
467 {
468  struct m0_rpc_link *rlink;
469 
470  M0_ENTRY("fom=%p", fom);
471 
472  rlink = container_of(fom, struct m0_rpc_link, rlk_fom);
473  m0_fom_fini(fom);
474  rlink->rlk_connected = connected && (rlink->rlk_rc == 0);
476 
477  M0_LEAVE();
478 }
479 
480 static void rpc_link_conn_fom_fini(struct m0_fom *fom)
481 {
483 }
484 
485 static void rpc_link_disc_fom_fini(struct m0_fom *fom)
486 {
488 }
489 
491 
492  [M0_RLS_INIT] = {
494  .sd_name = "Initialised",
495  .sd_allowed = M0_BITS(M0_RLS_CONN_FAILURE,
497  },
498  [M0_RLS_CONN_FAILURE] = {
499  .sd_flags = 0,
500  .sd_name = "Conn failure",
501  .sd_allowed = M0_BITS(M0_RLS_FINI)
502  },
503  [M0_RLS_SESS_FAILURE] = {
504  .sd_flags = 0,
505  .sd_name = "Session failure",
506  .sd_allowed = M0_BITS(M0_RLS_CONN_TERMINATING)
507  },
509  .sd_flags = 0,
510  .sd_name = "Connection terminating",
511  .sd_allowed = M0_BITS(M0_RLS_FINI)
512  },
514  .sd_flags = 0,
515  .sd_name = "Connection establishing",
516  .sd_allowed = M0_BITS(M0_RLS_CONN_FAILURE,
519  },
521  .sd_flags = 0,
522  .sd_name = "Session establishing",
523  .sd_allowed = M0_BITS(M0_RLS_SESS_FAILURE,
524  M0_RLS_FINI)
525  },
526  [M0_RLS_FINI] = {
527  .sd_flags = M0_SDF_TERMINAL,
528  .sd_name = "Fini",
529  .sd_allowed = 0
530  },
531 };
532 
533 static const struct m0_sm_conf rpc_link_conn_sm_conf = {
534  .scf_name = "rpc_link connection state machine",
535  .scf_nr_states = ARRAY_SIZE(rpc_link_conn_state_descr),
536  .scf_state = rpc_link_conn_state_descr
537 };
538 
540 
541  [M0_RLS_INIT] = {
543  .sd_name = "Initialised",
544  .sd_allowed = M0_BITS(M0_RLS_SESS_WAIT_IDLE)
545  },
546  [M0_RLS_CONN_FAILURE] = {
547  .sd_flags = 0,
548  .sd_name = "Conn failure",
549  .sd_allowed = M0_BITS(M0_RLS_FINI)
550  },
551  [M0_RLS_SESS_FAILURE] = {
552  .sd_flags = 0,
553  .sd_name = "Session failure",
554  .sd_allowed = M0_BITS(M0_RLS_CONN_TERMINATING)
555  },
557  .sd_flags = 0,
558  .sd_name = "Waiting for session is idle",
559  .sd_allowed = M0_BITS(M0_RLS_SESS_FAILURE,
561  },
563  .sd_flags = 0,
564  .sd_name = "Session termination",
565  .sd_allowed = M0_BITS(M0_RLS_SESS_FAILURE,
568  },
570  .sd_flags = 0,
571  .sd_name = "Connection termination",
572  .sd_allowed = M0_BITS(M0_RLS_CONN_FAILURE,
573  M0_RLS_FINI)
574  },
575  [M0_RLS_FINI] = {
576  .sd_flags = M0_SDF_TERMINAL,
577  .sd_name = "Fini",
578  .sd_allowed = 0
579  },
580 };
581 
582 static const struct m0_sm_conf rpc_link_disc_sm_conf = {
583  .scf_name = "rpc_link disconnection state machine",
584  .scf_nr_states = ARRAY_SIZE(rpc_link_disc_state_descr),
585  .scf_state = rpc_link_disc_state_descr
586 };
587 
589 
590 M0_INTERNAL int m0_rpc_link_module_init(void)
591 {
598  return 0;
599 }
600 
601 M0_INTERNAL void m0_rpc_link_module_fini(void)
602 {
603 }
604 
605 M0_INTERNAL int m0_rpc_link_init(struct m0_rpc_link *rlink,
606  struct m0_rpc_machine *mach,
607  struct m0_fid *svc_fid,
608  const char *ep,
609  uint64_t max_rpcs_in_flight)
610 {
611  struct m0_net_end_point *net_ep;
612  int rc;
613 
614  M0_ENTRY("rlink=%p ep=%s", rlink, ep);
615 
616  rlink->rlk_connected = false;
617  rlink->rlk_rc = 0;
618 
619  rc = m0_net_end_point_create(&net_ep, &mach->rm_tm, ep);
620  if (rc == 0) {
621  rc = m0_rpc_conn_init(&rlink->rlk_conn, svc_fid, net_ep, mach,
622  max_rpcs_in_flight);
623  m0_net_end_point_put(net_ep);
624  }
625  if (rc == 0) {
626  rc = m0_rpc_session_init(&rlink->rlk_sess, &rlink->rlk_conn);
627  if (rc != 0)
628  m0_rpc_conn_fini(&rlink->rlk_conn);
629  }
630  if (rc == 0) {
631  m0_mutex_init(&rlink->rlk_wait_mutex);
632  m0_chan_init(&rlink->rlk_wait, &rlink->rlk_wait_mutex);
633  }
634  return M0_RC(rc);
635 }
636 
637 M0_INTERNAL void m0_rpc_link_fini(struct m0_rpc_link *rlink)
638 {
639  M0_PRE(!rlink->rlk_connected);
640  m0_chan_fini_lock(&rlink->rlk_wait);
641  m0_mutex_fini(&rlink->rlk_wait_mutex);
642  /*
643  * The link may be already discharged, as the peered service object
644  * might be announced dead. So need to double-check if the underlying
645  * session and connection really require finalising.
646  */
648  m0_rpc_session_fini(&rlink->rlk_sess);
649  if (conn_state(&rlink->rlk_conn) != M0_RPC_CONN_FINALISED)
650  m0_rpc_conn_fini(&rlink->rlk_conn);
651 }
652 
653 M0_INTERNAL void m0_rpc_link_reset(struct m0_rpc_link *rlink)
654 {
655  int rc;
656 
657  /*
658  * This is a RPC session re-connection from a failed node.
659  * RPC session is already in M0_RPC_SESSION_FINALISED state.
660  * We need to init the session state again.
661  */
663  rc = m0_rpc_session_init(&rlink->rlk_sess, &rlink->rlk_conn);
664  M0_ASSERT(rc == 0);
665  } else {
667  }
668  m0_rpc_conn_reset(&rlink->rlk_conn);
669  rlink->rlk_rc = 0;
670 }
671 
672 static void rpc_link_fom_queue(struct m0_rpc_link *rlink,
673  struct m0_clink *wait_clink,
674  const struct m0_fom_type *fom_type,
675  const struct m0_fom_ops *fom_ops)
676 {
677  struct m0_rpc_machine *mach = rlink->rlk_conn.c_rpc_machine;
678 
679  M0_ENTRY("rlink=%p", rlink);
680  M0_PRE(ergo(wait_clink != NULL, wait_clink->cl_is_oneshot));
681 
682  rlink->rlk_rc = 0;
683  if (wait_clink != NULL)
684  m0_clink_add_lock(&rlink->rlk_wait, wait_clink);
685  M0_SET0(&rlink->rlk_fom);
686  m0_fom_init(&rlink->rlk_fom, fom_type, fom_ops, NULL, NULL,
687  mach->rm_reqh);
688  m0_fom_queue(&rlink->rlk_fom);
689 
690  M0_LEAVE();
691 }
692 
693 static int rpc_link_call_sync(struct m0_rpc_link *rlink,
694  m0_time_t abs_timeout,
695  rpc_link_cb_t cb)
696 {
697  struct m0_clink clink;
698 
699  M0_ENTRY("rlink=%p", rlink);
700 
702  clink.cl_is_oneshot = true;
703  cb(rlink, abs_timeout, &clink);
706 
707  return M0_RC(rlink->rlk_rc);
708 }
709 
710 M0_INTERNAL void m0_rpc_link_connect_async(struct m0_rpc_link *rlink,
711  m0_time_t abs_timeout,
712  struct m0_clink *wait_clink)
713 {
714  M0_ENTRY("rlink=%p", rlink);
715  M0_PRE(!rlink->rlk_connected);
716  M0_PRE(rlink->rlk_rc == 0);
717  rlink->rlk_timeout = abs_timeout;
718  rpc_link_fom_queue(rlink, wait_clink, &rpc_link_conn_fom_type,
720  M0_LEAVE();
721 }
722 
723 M0_INTERNAL int m0_rpc_link_connect_sync(struct m0_rpc_link *rlink,
724  m0_time_t abs_timeout)
725 {
726  return rpc_link_call_sync(rlink, abs_timeout,
728 }
729 
730 M0_INTERNAL void m0_rpc_link_disconnect_async(struct m0_rpc_link *rlink,
731  m0_time_t abs_timeout,
732  struct m0_clink *wait_clink)
733 {
734  M0_ENTRY("rlink=%p", rlink);
735  M0_PRE(rlink->rlk_connected);
736  M0_PRE(rlink->rlk_rc == 0);
737  rlink->rlk_timeout = abs_timeout;
738  rpc_link_fom_queue(rlink, wait_clink, &rpc_link_disc_fom_type,
740  M0_LEAVE();
741 }
742 
743 M0_INTERNAL int m0_rpc_link_disconnect_sync(struct m0_rpc_link *rlink,
744  m0_time_t abs_timeout)
745 {
746  return rpc_link_call_sync(rlink, abs_timeout,
748 }
749 
750 M0_INTERNAL bool m0_rpc_link_is_connected(const struct m0_rpc_link *rlink)
751 {
752  return rlink->rlk_connected;
753 }
754 
755 M0_INTERNAL const char *m0_rpc_link_end_point(const struct m0_rpc_link *rlink)
756 {
757  return m0_rpc_conn_addr(&rlink->rlk_conn);
758 }
759 
760 #undef M0_TRACE_SUBSYSTEM
761 
764 /*
765  * Local variables:
766  * c-indentation-style: "K&R"
767  * c-basic-offset: 8
768  * tab-width: 8
769  * fill-column: 80
770  * scroll-step: 1
771  * End:
772  */
773 /*
774  * vim: tabstop=8 shiftwidth=8 noexpandtab textwidth=80 nowrap
775  */
M0_INTERNAL void m0_chan_wait(struct m0_clink *link)
Definition: chan.c:336
#define M0_PRE(cond)
M0_INTERNAL void m0_chan_broadcast_lock(struct m0_chan *chan)
Definition: chan.c:178
#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
#define ergo(a, b)
Definition: misc.h:293
Definition: sm.h:350
uint64_t m0_time_t
Definition: time.h:37
#define M0_LOG(level,...)
Definition: trace.h:167
M0_LEAVE()
int(* fto_create)(struct m0_fop *fop, struct m0_fom **out, struct m0_reqh *reqh)
Definition: fom.h:650
M0_INTERNAL void m0_fom_callback_init(struct m0_fom_callback *cb)
Definition: fom.c:1454
static struct m0_addb2_mach * mach
Definition: storage.c:42
M0_INTERNAL void m0_fom_wait_on(struct m0_fom *fom, struct m0_chan *chan, struct m0_fom_callback *cb)
Definition: fom.c:1490
#define M0_BITS(...)
Definition: misc.h:236
M0_INTERNAL void m0_rpc_session_fini(struct m0_rpc_session *session)
Definition: session.c:292
#define container_of(ptr, type, member)
Definition: misc.h:33
#define M0_SET0(obj)
Definition: misc.h:64
m0_fom_phase
Definition: fom.h:372
M0_INTERNAL int m0_rpc_conn_terminate(struct m0_rpc_conn *conn, m0_time_t abs_timeout)
Definition: conn.c:1009
return M0_RC(rc)
Definition: sock.c:754
M0_INTERNAL const char * m0_rpc_conn_addr(const struct m0_rpc_conn *conn)
Definition: conn.c:1306
#define M0_ENTRY(...)
Definition: trace.h:170
void m0_fom_init(struct m0_fom *fom, const struct m0_fom_type *fom_type, const struct m0_fom_ops *ops, struct m0_fop *fop, struct m0_fop *reply, struct m0_reqh *reqh)
Definition: fom.c:1372
struct m0_rpc_machine * c_rpc_machine
Definition: conn.h:278
M0_INTERNAL void m0_rpc_machine_unlock(struct m0_rpc_machine *machine)
Definition: rpc_machine.c:558
M0_INTERNAL int m0_rpc_session_init(struct m0_rpc_session *session, struct m0_rpc_conn *conn)
Definition: session.c:204
void m0_fom_fini(struct m0_fom *fom)
Definition: fom.c:1324
M0_INTERNAL int m0_rpc_session_terminate(struct m0_rpc_session *session, m0_time_t abs_timeout)
Definition: session.c:622
M0_INTERNAL void m0_chan_init(struct m0_chan *chan, struct m0_mutex *ch_guard)
Definition: chan.c:96
#define M0_ASSERT(cond)
const char * scf_name
Definition: sm.h:352
M0_INTERNAL void m0_rpc_session_cancel(struct m0_rpc_session *session)
Definition: session.c:850
M0_INTERNAL void m0_fom_type_init(struct m0_fom_type *type, uint64_t id, const struct m0_fom_type_ops *ops, const struct m0_reqh_service_type *svc_type, const struct m0_sm_conf *sm)
Definition: fom.c:1596
M0_INTERNAL int session_state(const struct m0_rpc_session *session)
Definition: session.c:141
M0_INTERNAL void m0_mutex_init(struct m0_mutex *mutex)
Definition: mutex.c:35
Definition: dump.c:103
M0_INTERNAL void m0_rpc_session_reset(struct m0_rpc_session *session)
Definition: session.c:260
static struct m0_clink clink[RDWR_REQUEST_MAX]
struct m0_sm s_sm
Definition: session.h:325
void m0_clink_add_lock(struct m0_chan *chan, struct m0_clink *link)
Definition: chan.c:255
uint32_t sd_flags
Definition: sm.h:378
Definition: fom.h:481
void m0_net_end_point_put(struct m0_net_end_point *ep)
Definition: ep.c:98
Definition: fid.h:38
M0_INTERNAL void m0_rpc_machine_lock(struct m0_rpc_machine *machine)
Definition: rpc_machine.c:551
M0_INTERNAL int m0_rpc_conn_establish(struct m0_rpc_conn *conn, m0_time_t abs_timeout)
Definition: conn.c:857
M0_INTERNAL void m0_mutex_fini(struct m0_mutex *mutex)
Definition: mutex.c:42
M0_INTERNAL void m0_clink_fini(struct m0_clink *link)
Definition: chan.c:208
M0_INTERNAL void m0_fom_callback_cancel(struct m0_fom_callback *cb)
Definition: fom.c:1514
M0_INTERNAL int m0_rpc_session_establish(struct m0_rpc_session *session, m0_time_t abs_timeout)
Definition: session.c:390
M0_INTERNAL void m0_fom_queue(struct m0_fom *fom)
Definition: fom.c:624
void(* fo_fini)(struct m0_fom *fom)
Definition: fom.h:657
M0_INTERNAL int m0_rpc_conn_init(struct m0_rpc_conn *conn, struct m0_fid *svc_fid, struct m0_net_end_point *ep, struct m0_rpc_machine *machine, uint64_t max_rpcs_in_flight)
Definition: conn.c:293
static void fom_type(struct m0_addb2__context *ctx, const uint64_t *v, char *buf)
Definition: dump.c:516
M0_INTERNAL void m0_rpc_conn_ha_unsubscribe(struct m0_rpc_conn *conn)
Definition: conn.c:632
void m0_fom_phase_set(struct m0_fom *fom, int phase)
Definition: fom.c:1688
M0_INTERNAL void m0_chan_fini_lock(struct m0_chan *chan)
Definition: chan.c:112
uint32_t sm_state
Definition: sm.h:307
M0_INTERNAL void m0_rpc_conn_reset(struct m0_rpc_conn *conn)
Definition: conn.c:452
int32_t rc
Definition: trigger_fop.h:47
M0_INTERNAL int m0_net_end_point_create(struct m0_net_end_point **epp, struct m0_net_transfer_mc *tm, const char *addr)
Definition: ep.c:56
#define ARRAY_SIZE(a)
Definition: misc.h:45
M0_INTERNAL void m0_rpc_conn_fini(struct m0_rpc_conn *conn)
Definition: conn.c:558
static int conn_state(const struct m0_rpc_conn *conn)
Definition: conn_internal.h:66
M0_INTERNAL const char * m0_fom_phase_name(const struct m0_fom *fom, int phase)
Definition: fom.c:1722