Motr  M0
fdmi_echo.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 
24 #include "lib/assert.h"
25 #include "lib/errno.h"
26 #include "lib/getopts.h"
27 #include "lib/memory.h"
28 #include "lib/misc.h" /* M0_SET0 */
29 #include "lib/thread.h"
30 #include "lib/time.h"
31 #include "motr/init.h"
32 #include "reqh/reqh.h" /* m0_reqh_rpc_mach_tl */
33 #include "net/net.h"
34 #include "net/lnet/lnet.h"
35 #include "fop/fop.h" /* m0_fop_default_item_ops */
36 #include "rpc/rpc.h"
37 #include "rpc/rpclib.h" /* m0_rpc_server_start */
38 #include "ut/cs_service.h" /* m0_cs_default_stypes */
39 #include "fop/fom_generic.h" /* m0_rpc_item_generic_reply_rc */
40 #include "reqh/reqh.h" /* m0_reqh_rpc_mach_tl */
41 #include "fdmi/fdmi.h"
42 #include "fdmi/fops.h"
43 #include "fdmi/plugin_dock.h"
44 #include "fol/fol.h"
45 
46 #include <stdlib.h>
47 #include <stdio.h>
48 #include <string.h>
49 #include <errno.h>
50 #include <unistd.h> /* read */
51 #include "module/instance.h" /* m0 */
52 
53 #define SERVER_DB_FILE_NAME "echo_plugin_server.db"
54 #define SERVER_STOB_FILE_NAME "echo_plugin_server.stob"
55 #define SERVER_ADDB_STOB_FILE_NAME "linuxstob:echo_plugin_server_addb.stob"
56 #define SERVER_LOG_FILE_NAME "echo_plugin.log"
57 
58 static struct m0 instance;
59 
60 const char g_filenane[] = "/tmp/fdmi_plugin.txt";
61 
63  const struct m0_fdmi_pd_ops *pdo;
64  struct m0_fid flt_fids[1];
65  FILE *log_file;
66  char *log_str;
68 };
69 
71 
72 enum {
73  BUF_LEN = 128,
77 };
78 
79 
80 static bool verbose = false;
81 static char *server_nid = "10.0.2.15@tcp";
82 //static char *server_nid = "192.168.183.187@tcp";
83 
84 static int server_tmid = 1;
87 
89 
90 static int build_endpoint_addr(char *out_buf, size_t buf_size)
91 {
92  char *ep_name;
93  char *nid;
94  int tmid;
95 
96  nid = server_nid;
97  ep_name = "server";
98  tmid = server_tmid;
99 
101  return -1;
102  else
103  snprintf(out_buf, buf_size, "%s:%u:%u:%u", nid,
104  (unsigned int)M0_NET_LNET_PID,
105  (unsigned int)M0_LNET_PORTAL,
106  (unsigned int)tmid);
107 
108  if (verbose)
109  printf("%s endpoint: %s\n", ep_name, out_buf);
110 
111  return 0;
112 }
113 
114 static void quit_dialog(void)
115 {
116  char ch;
117  size_t nr;
118 
119  printf("\n########################################\n");
120  printf("\n\nPlugin started. Press Enter to terminate\n\n");
121  printf("\n########################################\n");
122  nr = read(0, &ch, sizeof ch);
123  if (nr > 0)
124  printf("\n\nPlugin terminated.\n");
125 }
126 
127 static int int2str(char *dest, size_t size, int src, int defval)
128 {
129  int rc = snprintf(dest, size, "%d", src > 0 ? src : defval);
130  return (rc < 0 || rc >= size) ? -EINVAL : 0;
131 }
132 
133 
134 int handle_fdmi_rec_not(struct m0_uint128 *rec_id,
135  struct m0_buf fdmi_rec,
136  struct m0_fid filter_id)
137 {
138  struct m0_fol_rec fol_rec;
139  int rc;
140  struct fdmi_plugin_ctx *ctx = &g_plugin_ctx;
141 
143  m0_fol_rec_init(&fol_rec, NULL);
144 
145  m0_fol_rec_decode(&fol_rec, &fdmi_rec);
146 
147  rc = m0_fol_rec_to_str(&fol_rec, ctx->log_str, ctx->log_str_size);
148 
149  while (rc == -ENOMEM && ctx->log_str) {
150  m0_free(ctx->log_str);
151  M0_ALLOC_ARR(ctx->log_str, ctx->log_str_size + 1024);
152 
153  M0_ASSERT(ctx->log_str != NULL);
154 
155  rc = m0_fol_rec_to_str(&fol_rec, ctx->log_str, ctx->log_str_size);
156  ctx->log_str_size += 1024;
157  }
158 
159  if (rc == 0) {
160  fprintf(ctx->log_file, "#####################\n");
161  fprintf(ctx->log_file, "%s\n", ctx->log_str);
162  fprintf(ctx->log_file, "#####################\n");
163  }
164 
165  m0_fol_rec_fini(&fol_rec);
166 
168  return -EINVAL;
169 }
170 
171 static int init_plugin(struct fdmi_plugin_ctx *ctx,
172  const char *fname)
173 {
174  int rc;
175  const struct m0_fdmi_plugin_ops pcb = {
177  };
178 
179  const struct m0_fdmi_filter_desc fd;
180 
181  ctx->log_file = fopen(fname, "w+");
182 
183  if (ctx->log_file == NULL)
184  return -errno;
185 
186  M0_ALLOC_ARR(ctx->log_str, 1024);
187 
188  if (ctx->log_str == NULL) {
189  rc = -ENOMEM;
190  goto str_alloc_fail;
191  }
192 
193  ctx->log_str_size = 1024;
194 
196 
197  /*.f_container = 0xB5C0A99B8817440B,*/
198  /*.f_key = 0x877A9A5FAFFD6BB7,*/
199  ctx->flt_fids[0].f_container = 11;
200  ctx->flt_fids[0].f_key = 11;
201 
203 
204  rc = ctx->pdo->fpo_register_filter(&ctx->flt_fids[0], &fd, &pcb);
205 
206  if (rc != 0) {
207  goto register_fail;
208  }
209 
210  ctx->pdo->fpo_enable_filters(true, ctx->flt_fids,
211  ARRAY_SIZE(ctx->flt_fids));
212 
213  return rc;
214 
215 register_fail:
216  m0_free(ctx->log_str);
217 str_alloc_fail:
218  fclose(ctx->log_file);
219  return rc;
220 }
221 
222 static void deinit_plugin(struct fdmi_plugin_ctx *ctx)
223 {
224  ctx->pdo->fpo_enable_filters(false, ctx->flt_fids,
225  ARRAY_SIZE(ctx->flt_fids));
226 
227  ctx->pdo->fpo_deregister_plugin(
228  ctx->flt_fids, ARRAY_SIZE(ctx->flt_fids));
229 
230  fclose(ctx->log_file);
231 }
232 
233 static int run_server(void)
234 {
235  enum { STRING_LEN = 16 };
236  static char tm_len[STRING_LEN];
237  static char rpc_size[STRING_LEN];
238  int rc;
239  char *argv[] = {
240  "rpclib_ut", "-T", "AD", "-D", SERVER_DB_FILE_NAME,
242  "-A", SERVER_ADDB_STOB_FILE_NAME, "-w", "5",
243  "-s", "ds1", "-s", "ds2", "-s", "fdmi", "-q", tm_len, "-m", rpc_size,
244  };
245  struct m0_rpc_server_ctx sctx = {
247  .rsx_xprts_nr = m0_net_xprt_nr(),
248  .rsx_argv = argv,
249  .rsx_argc = ARRAY_SIZE(argv),
250  .rsx_log_file_name = SERVER_LOG_FILE_NAME
251  };
252 
253  rc = int2str(tm_len, sizeof tm_len, tm_recv_queue_len,
255  int2str(rpc_size, sizeof rpc_size, max_rpc_msg_size,
257  if (rc != 0)
258  return rc;
259 
260  rc = m0_init(&instance);
261  if (rc != 0)
262  return rc;
263 
265  if (rc != 0)
266  goto m0_fini;
267 
269  if (rc != 0)
270  goto fop_fini;
271 
272  /*
273  * Prepend transport name to the beginning of endpoint,
274  * as required by motr-setup.
275  */
277 
280  sizeof(server_endpoint) - strlen(server_endpoint));
281  if (rc != 0)
282  goto plugin_fini;
283 
285  if (rc != 0)
286  goto plugin_fini;
287 
288  quit_dialog();
289 
291 
292 plugin_fini:
294 fop_fini:
296 m0_fini:
297  m0_fini();
298  return rc;
299 }
300 
301 int main(int argc, char *argv[])
302 {
303  int rc;
304 
305  rc = run_server();
306 
307  return rc;
308 }
309 
310 /*
311  * Local variables:
312  * c-indentation-style: "K&R"
313  * c-basic-offset: 8
314  * tab-width: 8
315  * fill-column: 80
316  * scroll-step: 1
317  * End:
318  */
int handle_fdmi_rec_not(struct m0_uint128 *rec_id, struct m0_buf fdmi_rec, struct m0_fid filter_id)
Definition: fdmi_echo.c:134
static void deinit_plugin(struct fdmi_plugin_ctx *ctx)
Definition: fdmi_echo.c:222
static size_t nr
Definition: dump.c:1505
#define M0_ALLOC_ARR(arr, nr)
Definition: memory.h:84
static int init_plugin(struct fdmi_plugin_ctx *ctx, const char *fname)
Definition: fdmi_echo.c:171
#define SERVER_STOB_FILE_NAME
Definition: fdmi_echo.c:54
#define NULL
Definition: misc.h:38
M0_INTERNAL void m0_fol_rec_fini(struct m0_fol_rec *rec)
Definition: fol.c:104
void m0_fini(void)
Definition: init.c:318
FILE * log_file
Definition: fdmi_echo.c:65
#define SERVER_DB_FILE_NAME
Definition: fdmi_echo.c:53
int m0_cs_default_stypes_init(void)
Definition: cs_service.c:161
int m0_rpc_server_start(struct m0_rpc_server_ctx *sctx)
Definition: rpclib.c:50
struct m0_fid flt_fids[1]
Definition: fdmi_echo.c:64
static bool verbose
Definition: fdmi_echo.c:80
static int server_tmid
Definition: fdmi_echo.c:84
int m0_init(struct m0 *instance)
Definition: init.c:310
int main(int argc, char *argv[])
Definition: fdmi_echo.c:301
int(* po_fdmi_rec)(struct m0_uint128 *rec_id, struct m0_buf fdmi_rec, struct m0_fid filter_id)
Definition: plugin_dock.h:62
Definition: buf.h:37
static int int2str(char *dest, size_t size, int src, int defval)
Definition: fdmi_echo.c:127
M0_INTERNAL void m0_fol_rec_init(struct m0_fol_rec *rec, struct m0_fol *fol)
Definition: fol.c:98
static struct m0 instance
Definition: fdmi_echo.c:58
static int tm_recv_queue_len
Definition: fdmi_echo.c:85
int m0_fol_rec_to_str(struct m0_fol_rec *rec, char *str, int str_len)
Definition: fol.c:380
#define SERVER_ADDB_STOB_FILE_NAME
Definition: fdmi_echo.c:55
#define SERVER_LOG_FILE_NAME
Definition: fdmi_echo.c:56
char * log_str
Definition: fdmi_echo.c:66
#define M0_NET_XPRT_PREFIX_DEFAULT
Definition: net.h:98
#define M0_ASSERT(cond)
int m0_net_xprt_nr(void)
Definition: net.c:168
Definition: instance.h:80
struct m0_net_xprt ** rsx_xprts
Definition: rpclib.h:69
static char server_endpoint[M0_NET_LNET_XEP_ADDR_LEN]
Definition: fdmi_echo.c:88
static struct m0_rpc_server_ctx sctx
Definition: console.c:88
static char * server_nid
Definition: fdmi_echo.c:81
static void fop_fini(void)
Definition: iterator_test.c:41
struct fdmi_plugin_ctx g_plugin_ctx
Definition: fdmi_echo.c:70
static void quit_dialog(void)
Definition: fdmi_echo.c:114
const char g_filenane[]
Definition: fdmi_echo.c:60
Definition: fid.h:38
struct m0_net_xprt ** m0_net_all_xprt_get(void)
Definition: net.c:161
m0_bcount_t size
Definition: di.c:39
static int max_rpc_msg_size
Definition: fdmi_echo.c:86
struct m0t1fs_filedata * fd
Definition: dir.c:1030
void m0_rpc_server_stop(struct m0_rpc_server_ctx *sctx)
Definition: rpclib.c:85
static uint32_t buf_size
Definition: ad.c:75
static int build_endpoint_addr(char *out_buf, size_t buf_size)
Definition: fdmi_echo.c:90
Definition: nucleus.c:42
const struct m0_fdmi_pd_ops * pdo
Definition: fdmi_echo.c:63
void m0_free(void *data)
Definition: memory.c:146
struct m0_pdclust_src_addr src
Definition: fd.c:108
int32_t rc
Definition: trigger_fop.h:47
#define ARRAY_SIZE(a)
Definition: misc.h:45
static int run_server(void)
Definition: fdmi_echo.c:233
void m0_cs_default_stypes_fini(void)
Definition: cs_service.c:174
M0_INTERNAL int m0_fol_rec_decode(struct m0_fol_rec *rec, struct m0_buf *at)
Definition: fol.c:331
const struct m0_fdmi_pd_ops * m0_fdmi_plugin_dock_api_get(void)
Definition: plugin_dock.c:563