Motr  M0
item.h
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 #pragma once
24 
25 #ifndef __MOTR_RPC_ITEM_H__
26 #define __MOTR_RPC_ITEM_H__
27 
28 #include "lib/types.h" /* m0_bcount_t */
29 #include "lib/tlist.h"
30 #include "lib/list.h"
31 #include "lib/time.h"
32 #include "sm/sm.h" /* m0_sm */
33 #include "rpc/onwire.h" /* m0_rpc_item_header2 */
34 
41 /* Imports */
42 struct m0_rpc_session;
43 struct m0_bufvec_cursor;
44 struct m0_rpc_frm;
45 struct m0_rpc_machine;
46 
47 /* Forward declarations */
48 struct m0_rpc_item_ops;
49 struct m0_rpc_item_type;
50 
56 };
57 
104 };
105 
112 };
113 
118  M0_RPC_ITEM_RESEND_INTERVAL = 1, /* in secs */
119  M0_RPC_ITEM_REPLY_CACHE_TMO = 100, /* refer to M0T1FS_RPC_TIMEOUT */
120  M0_RPC_ITEM_REQ_CACHE_TMO = 100, /* refer to M0T1FS_RPC_TIMEOUT */
121 };
122 
130 struct m0_rpc_item {
131 /* Public fields: write-once/read */
132 
134 
136  uint64_t ri_ha_epoch;
137 
146  uint64_t ri_nr_sent_max;
149  const struct m0_rpc_item_ops *ri_ops;
156  uint32_t ri_flags;
157 
158 /* Public fields: read only */
159 
161  int32_t ri_error;
164 
165 /* Private fields: */
181  struct m0_sm ri_sm;
183  uint32_t ri_nr_sent;
188 
190  uint64_t ri_cookid;
191 
194 
198  size_t ri_size;
200  const struct m0_rpc_item_type *ri_type;
225  struct m0_tl *ri_itemq;
232  uint64_t ri_magic;
241 };
242 
249  M0_RIF_DUP = 1 << 0,
253  M0_RIF_REPLIED = 1 << 1,
254 };
255 
267  void (*rio_sent)(struct m0_rpc_item *item);
300  void (*rio_replied)(struct m0_rpc_item *item);
301 };
302 
303 void m0_rpc_item_init(struct m0_rpc_item *item,
304  const struct m0_rpc_item_type *itype);
305 
306 void m0_rpc_item_fini(struct m0_rpc_item *item);
307 
309 void m0_rpc_item_get(struct m0_rpc_item *item);
310 
312 void m0_rpc_item_put(struct m0_rpc_item *item);
314 
319 
321 M0_INTERNAL
323  struct m0_rpc_session *session);
324 
334  uint64_t states, m0_time_t timeout);
335 
354 void m0_rpc_item_cancel(struct m0_rpc_item *item);
355 
361 
373 
374 int32_t m0_rpc_item_error(const struct m0_rpc_item *item);
375 
386 
391  bool (*rito_eq)(const struct m0_rpc_item *i1,
392  const struct m0_rpc_item *i2);
393 
398  struct m0_list *list, uint64_t size);
399 
404  int (*rito_encode)(const struct m0_rpc_item_type *item_type,
405  struct m0_rpc_item *item,
406  struct m0_bufvec_cursor *cur);
411  int (*rito_decode)(const struct m0_rpc_item_type *item_type,
412  struct m0_rpc_item **item,
413  struct m0_bufvec_cursor *cur);
414 
416  struct m0_rpc_item *component,
417  m0_bcount_t limit);
418 
423  void (*rito_item_get)(struct m0_rpc_item *item);
428  void (*rito_item_put)(struct m0_rpc_item *item);
429 
438  int (*rito_deliver)(struct m0_rpc_machine *rpcmach,
439  struct m0_rpc_item *item);
440 };
441 
464 
466 };
467 
474  uint32_t rit_opcode;
478  uint64_t rit_flags;
482  uint64_t rit_magic;
485 };
486 
494 M0_INTERNAL void m0_rpc_item_type_register(struct m0_rpc_item_type *item_type);
495 
501 M0_INTERNAL void m0_rpc_item_type_deregister(struct m0_rpc_item_type
502  *item_type);
503 
510 M0_INTERNAL struct m0_rpc_item_type *m0_rpc_item_type_lookup(uint32_t opcode);
511 
515 M0_INTERNAL const char *
517 
518 M0_INTERNAL const char *m0_rpc_item_opname(const struct m0_rpc_item *item);
519 
520 M0_INTERNAL const char *
521 m0_rpc_item_type_name(const struct m0_rpc_item_type *item_type);
522 
523 enum {
526 };
527 
550  struct m0_tl *ric_items;
553 };
554 
559 M0_INTERNAL int m0_rpc_item_cache_init(struct m0_rpc_item_cache *ic,
560  struct m0_mutex *lock);
561 M0_INTERNAL void m0_rpc_item_cache_fini(struct m0_rpc_item_cache *ic);
562 M0_INTERNAL bool m0_rpc_item_cache__invariant(struct m0_rpc_item_cache *ic);
563 
576 M0_INTERNAL bool m0_rpc_item_cache_add(struct m0_rpc_item_cache *ic,
577  struct m0_rpc_item *item,
578  m0_time_t deadline);
585 M0_INTERNAL void m0_rpc_item_cache_del(struct m0_rpc_item_cache *ic,
586  uint64_t xid);
593 M0_INTERNAL struct m0_rpc_item *
594 m0_rpc_item_cache_lookup(struct m0_rpc_item_cache *ic, uint64_t xid);
595 
597 M0_INTERNAL void m0_rpc_item_cache_purge(struct m0_rpc_item_cache *ic);
599 M0_INTERNAL void m0_rpc_item_cache_clear(struct m0_rpc_item_cache *ic);
600 
601 M0_INTERNAL void m0_rpc_item_xid_list_init(struct m0_rpc_session *session);
602 M0_INTERNAL void m0_rpc_item_xid_list_fini(struct m0_rpc_session *session);
603 
605 M0_INTERNAL void m0_rpc_item_pending_cache_init(struct m0_rpc_session *session);
607 M0_INTERNAL void m0_rpc_item_pending_cache_fini(struct m0_rpc_session *session);
608 
613 M0_INTERNAL void m0_rpc_item_pending_cache_add( struct m0_rpc_item *item);
615 M0_INTERNAL void m0_rpc_item_pending_cache_del(struct m0_rpc_item *item);
616 
617 #define ITEM_FMT "%p [%s/%s(%u)]"
618 #define ITEM_ARG(item) (item), item_kind(item), m0_rpc_item_opname(item), \
619  ((item)->ri_type != NULL ? (item)->ri_type->rit_opcode : 0)
620 
621 #endif
622 
625 /*
626  * Local variables:
627  * c-indentation-style: "K&R"
628  * c-basic-offset: 8
629  * tab-width: 8
630  * fill-column: 80
631  * scroll-step: 1
632  * End:
633  */
M0_INTERNAL void m0_rpc_item_xid_list_fini(struct m0_rpc_session *session)
Definition: item.c:1675
struct m0_tl * ric_items
Definition: item.h:550
static struct m0_mutex lock
Definition: transmit.c:326
uint32_t rit_opcode
Definition: item.h:474
m0_time_t ri_resend_interval
Definition: item.h:144
static struct m0_list list
Definition: list.c:144
enum m0_rpc_item_priority ri_prio
Definition: item.h:133
M0_INTERNAL void m0_rpc_item_xid_list_init(struct m0_rpc_session *session)
Definition: item.c:1669
struct m0_tlink ri_cache_link
Definition: item.h:234
static struct buffer * cur(struct m0_addb2_mach *mach, m0_bcount_t space)
Definition: addb2.c:791
struct m0_sm_timer ri_timer
Definition: item.h:176
Definition: sm.h:350
size_t ri_size
Definition: item.h:198
const struct m0_rpc_item_type_ops * rit_ops
Definition: item.h:476
void m0_rpc_item_put(struct m0_rpc_item *item)
Definition: item.c:443
uint64_t m0_time_t
Definition: time.h:37
struct m0_container container
void m0_rpc_item_get(struct m0_rpc_item *item)
Definition: item.c:434
struct m0_mutex * ric_lock
Definition: item.h:552
struct m0_tl ri_compound_items
Definition: item.h:204
struct m0_sm ri_sm
Definition: item.h:181
M0_INTERNAL void m0_rpc_item_cache_fini(struct m0_rpc_item_cache *ic)
Definition: item.c:1566
struct m0_tlink ri_pending_link
Definition: item.h:230
int32_t ri_error
Definition: item.h:161
struct m0_rpc_item * ri_pending_reply
Definition: item.h:187
m0_time_t ri_cache_deadline
Definition: item.h:240
m0_rpc_item_flags
Definition: item.h:243
M0_INTERNAL struct m0_rpc_item_type * m0_rpc_item_type_lookup(uint32_t opcode)
Definition: item.c:189
struct m0_sm_conf rit_incoming_conf
Definition: item.h:483
uint64_t m0_bcount_t
Definition: types.h:77
static struct m0_rpc_session session
Definition: formation2.c:38
m0_rpc_item_priority
Definition: item.h:51
M0_INTERNAL void m0_rpc_item_type_register(struct m0_rpc_item_type *item_type)
Definition: item.c:154
struct m0_sm_timeout ri_deadline_timeout
Definition: item.h:169
void m0_rpc_item_init(struct m0_rpc_item *item, const struct m0_rpc_item_type *itype)
Definition: item.c:364
static struct m0_rpc_item * item
Definition: item.c:56
int m0_rpc_item_wait_for_reply(struct m0_rpc_item *item, m0_time_t timeout)
Definition: item.c:824
m0_rpc_item_state
Definition: item.h:58
M0_INTERNAL void m0_rpc_item_pending_cache_add(struct m0_rpc_item *item)
Definition: item.c:1710
m0_rpc_item_resend
Definition: item.h:114
m0_time_t ri_rpc_time
Definition: item.h:202
static int head(struct m0_sm *mach)
Definition: sm.c:468
m0_bcount_t m0_rpc_item_size(struct m0_rpc_item *item)
Definition: item.c:470
bool(* rito_eq)(const struct m0_rpc_item *i1, const struct m0_rpc_item *i2)
Definition: item.h:391
void m0_rpc_item_fini(struct m0_rpc_item *item)
Definition: item.c:394
int opcode
Definition: crate.c:301
struct m0_tlink ri_xid_link
Definition: item.h:236
bool ri_xid_assigned_here
Definition: item.h:238
struct m0_tlink ri_field
Definition: item.h:207
struct m0_tlink ri_iq_link
Definition: item.h:211
m0_bcount_t(* rito_payload_size)(const struct m0_rpc_item *item)
Definition: item.h:385
void(* rito_item_get)(struct m0_rpc_item *item)
Definition: item.h:423
M0_INTERNAL const char * m0_rpc_item_type_name(const struct m0_rpc_item_type *item_type)
Definition: item.c:1202
void m0_rpc_item_cancel(struct m0_rpc_item *item)
Definition: item.c:932
M0_INTERNAL void m0_rpc_item_pending_cache_del(struct m0_rpc_item *item)
Definition: item.c:1741
uint64_t ri_magic
Definition: item.h:232
struct m0_sm_conf rit_outgoing_conf
Definition: item.h:484
struct m0_rpc_item_header2 ri_header
Definition: item.h:193
Definition: tlist.h:251
int(* rito_decode)(const struct m0_rpc_item_type *item_type, struct m0_rpc_item **item, struct m0_bufvec_cursor *cur)
Definition: item.h:411
M0_INTERNAL bool m0_rpc_item_max_payload_exceeded(struct m0_rpc_item *item, struct m0_rpc_session *session)
Definition: item.c:490
M0_INTERNAL void m0_rpc_item_cache_purge(struct m0_rpc_item_cache *ic)
Definition: item.c:1639
M0_INTERNAL void m0_rpc_item_cache_del(struct m0_rpc_item_cache *ic, uint64_t xid)
Definition: item.c:1616
struct m0_rpc_frm * ri_frm
Definition: item.h:226
bool(* rito_try_merge)(struct m0_rpc_item *container, struct m0_rpc_item *component, m0_bcount_t limit)
Definition: item.h:415
uint64_t rit_magic
Definition: item.h:482
const struct m0_rpc_item_type * ri_type
Definition: item.h:200
struct m0_rpc_item * ri_reply
Definition: item.h:163
uint64_t ri_nr_sent_max
Definition: item.h:146
uint32_t ri_flags
Definition: item.h:156
uint64_t ri_cookid
Definition: item.h:190
M0_INTERNAL void m0_rpc_item_type_deregister(struct m0_rpc_item_type *item_type)
Definition: item.c:176
void(* rio_sent)(struct m0_rpc_item *item)
Definition: item.h:267
struct m0_tlink ri_plink
Definition: item.h:218
void(* rito_item_put)(struct m0_rpc_item *item)
Definition: item.h:428
M0_INTERNAL void m0_rpc_item_pending_cache_fini(struct m0_rpc_session *session)
Definition: item.c:1703
M0_INTERNAL const char * m0_rpc_item_opname(const struct m0_rpc_item *item)
Definition: item.c:1195
M0_INTERNAL void m0_rpc_item_pending_cache_init(struct m0_rpc_session *session)
Definition: item.c:1687
uint64_t rit_flags
Definition: item.h:478
Definition: list.h:72
static uint32_t timeout
Definition: console.c:52
M0_INTERNAL void m0_rpc_item_cache_clear(struct m0_rpc_item_cache *ic)
Definition: item.c:1655
void(* rio_replied)(struct m0_rpc_item *item)
Definition: item.h:300
struct m0_rpc_packet * ri_packet
Definition: item.h:223
int32_t m0_rpc_item_error(const struct m0_rpc_item *item)
Definition: item.c:973
void m0_rpc_item_put_lock(struct m0_rpc_item *item)
Definition: item.c:454
M0_INTERNAL bool m0_rpc_item_cache_add(struct m0_rpc_item_cache *ic, struct m0_rpc_item *item, m0_time_t deadline)
Definition: item.c:1583
M0_INTERNAL int m0_rpc_item_cache_init(struct m0_rpc_item_cache *ic, struct m0_mutex *lock)
Definition: item.c:1547
const struct m0_rpc_item_ops * ri_ops
Definition: item.h:149
struct m0_rpc_session * ri_session
Definition: item.h:147
struct m0_tl * ri_itemq
Definition: item.h:225
Definition: sm.h:301
m0_rpc_item_type_flags
Definition: item.h:447
M0_EXTERN m0_bcount_t m0_rpc_item_onwire_footer_size
Definition: item.h:316
m0_bcount_t size
Definition: di.c:39
m0_rpc_item_dir
Definition: item.h:109
void m0_rpc_item_cancel_nolock(struct m0_rpc_item *item)
Definition: item.c:867
m0_bcount_t m0_rpc_item_payload_size(struct m0_rpc_item *item)
Definition: item.c:480
M0_INTERNAL bool m0_rpc_item_cache__invariant(struct m0_rpc_item_cache *ic)
Definition: item.c:1578
M0_INTERNAL struct m0_rpc_item * m0_rpc_item_cache_lookup(struct m0_rpc_item_cache *ic, uint64_t xid)
Definition: item.c:1631
void(* rito_io_coalesce)(struct m0_rpc_item *head, struct m0_list *list, uint64_t size)
Definition: item.h:397
int(* rito_deliver)(struct m0_rpc_machine *rpcmach, struct m0_rpc_item *item)
Definition: item.h:438
uint32_t ri_nr_sent
Definition: item.h:183
struct m0_tlink rit_linkage
Definition: item.h:480
struct m0_rpc_machine * ri_rmachine
Definition: item.h:160
int m0_rpc_item_timedwait(struct m0_rpc_item *item, uint64_t states, m0_time_t timeout)
Definition: item.c:813
Definition: mutex.h:47
uint64_t ri_ha_epoch
Definition: item.h:136
static struct m0_sm_state_descr states[C_NR]
Definition: sm.c:512
int(* rito_encode)(const struct m0_rpc_item_type *item_type, struct m0_rpc_item *item, struct m0_bufvec_cursor *cur)
Definition: item.h:404
M0_INTERNAL const char * m0_rpc_item_remote_ep_addr(const struct m0_rpc_item *item)
Definition: item.c:1188
void m0_rpc_item_cancel_init(struct m0_rpc_item *item)
Definition: item.c:947
m0_time_t ri_deadline
Definition: item.h:141
M0_EXTERN m0_bcount_t m0_rpc_item_onwire_header_size
Definition: item.h:315