Motr  M0
parser.c
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2017-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 #include <stdio.h>
24 #include <stdlib.h>
25 #include <stdbool.h>
26 #include <errno.h>
27 #include <stdarg.h>
28 
29 #include "lib/string.h"
30 #include "motr/m0crate/parser.h"
32 
35 };
36 
37 extern struct workload_type_ops ops;
38 extern struct workload_type_ops index_ops;
39 extern struct crate_conf *conf;
40 
60  /*
61  * All parameters below are workload-specific,
62  * anything else should be added above this point.
63  * The check for index at copy_value() relies on this.
64  */
73  PUT,
74  GET,
76  DEL,
100 };
101 
103  char *key;
105 };
106 
108  {"MOTR_LOCAL_ADDR", LOCAL_ADDR},
109  {"MOTR_HA_ADDR", HA_ADDR},
110  {"PROF", PROF},
111  {"LAYOUT_ID", LAYOUT_ID},
112  {"IS_OOSTORE", IS_OOSTORE},
113  {"IS_READ_VERIFY", IS_READ_VERIFY},
114  {"TM_RECV_QUEUE_MIN_LEN", MAX_QUEUE_LEN},
115  {"M0_MAX_RPC_MSG_SIZE", MAX_RPC_MSG},
116  {"PROCESS_FID", PROCESS_FID},
117  {"IDX_SERVICE_ID", IDX_SERVICE_ID},
118  {"CASS_CLUSTER_EP", CASS_EP},
119  {"CASS_KEYSPACE", CASS_KEYSPACE},
120  {"CASS_MAX_COL_FAMILY_NUM", CASS_COL_FAMILY},
121  {"ADDB_INIT", ADDB_INIT},
122  {"ADDB_SIZE", ADDB_SIZE},
123  {"WORKLOAD_TYPE", WORKLOAD_TYPE},
124  {"WORKLOAD_SEED", SEED},
125  {"NR_THREADS", NR_THREADS},
126  {"OPS", NUM_OPS},
127  {"NUM_IDX", NUM_IDX},
128  {"NUM_KVP", NUM_KVP},
129  {"RECORD_SIZE", VALUE_SIZE},
130  {"MAX_RSIZE", MAX_VALUE_SIZE},
131  {"GET", GET},
132  {"PUT", PUT},
133  {"POOL_FID", POOL_FID},
134  {"NEXT", NEXT},
135  {"DEL", DEL},
136  {"NXRECORDS", NXRECORDS},
137  {"OP_COUNT", OP_COUNT},
138  {"EXEC_TIME", EXEC_TIME},
139  {"WARMUP_PUT_CNT", WARMUP_PUT_CNT},
140  {"WARMUP_DEL_RATIO", WARMUP_DEL_RATIO},
141  {"KEY_PREFIX", KEY_PREFIX},
142  {"KEY_ORDER", KEY_ORDER},
143  {"KEY_SIZE", KEY_SIZE},
144  {"VALUE_SIZE", VALUE_SIZE},
145  {"MAX_KEY_SIZE", MAX_KEY_SIZE},
146  {"MAX_VALUE_SIZE", MAX_VALUE_SIZE},
147  {"INDEX_FID", INDEX_FID},
148  {"LOG_LEVEL", LOG_LEVEL},
149  {"NR_OBJS", NR_OBJS},
150  {"NR_THREADS", NR_THREADS},
151  {"THREAD_OPS", THREAD_OPS},
152  {"BLOCK_SIZE", BLOCK_SIZE},
153  {"BLOCKS_PER_OP", BLOCKS_PER_OP},
154  {"IOSIZE", IOSIZE},
155  {"SOURCE_FILE", SOURCE_FILE},
156  {"RAND_IO", RAND_IO},
157  {"OPCODE", OPCODE},
158  {"STARTING_OBJ_ID", START_OBJ_ID},
159  {"MODE", MODE},
160  {"MAX_NR_OPS", MAX_NR_OPS},
161  {"IS_ENF_META", IS_ENF_META},
162  {"NR_ROUNDS", NR_ROUNDS},
163 };
164 
165 #define NKEYS (sizeof(lookuptable)/sizeof(struct key_lookup_table))
166 
168 {
169  int i;
170  char *s1;
171 
172  for(i = 0; i < NKEYS; i++) {
173  s1 = strstr(key, lookuptable[i].key);
174  if (s1 != NULL && !strcmp(key, lookuptable[i].key)) {
175  return lookuptable[i].index;
176  }
177  }
178  return INVALID_OPT;
179 }
180 
181 const char *get_key_from_index(const enum config_key_val key)
182 {
183  int i;
184  const char *result = NULL;
185 
186  for(i = 0; i < NKEYS; i++) {
187  if (key == lookuptable[i].index) {
188  result = lookuptable[i].key;
189  break;
190  }
191  }
192 
193  return result;
194 }
195 
196 void parser_emit_error(const char *fmt, ...)
197  __attribute__((no_exit))
198  __attribute__((format(printf, 1,2)));
199 
200 void parser_emit_error(const char *fmt, ...)
201 {
202  va_list args;
203  va_start(args, fmt);
204  vfprintf(stderr, fmt, args);
205  fprintf(stderr, "\n");
206  va_end(args);
207  exit(EXIT_FAILURE);
208 }
209 
210 static int parse_int_with_units(const char *value, enum config_key_val tag)
211 {
212  unsigned long long v = getnum(value, get_key_from_index(tag));
213 
214  if (v > INT_MAX)
215  parser_emit_error("Value overflow detected (value=%s, tag=%s", value, get_key_from_index(tag));
216 
217  return v;
218 }
219 
220 static int parse_int(const char *value, enum config_key_val tag)
221 {
222  char *endptr;
223  long val = 0;
224 
225  val = strtol(value, &endptr, 10);
226 
227  if ((val == LONG_MAX || val == LONG_MIN) && errno == ERANGE) {
228  parser_emit_error("Invalid int value (value '%s'='%s', err: %s).\n", get_key_from_index(tag), value, strerror(errno));
229  }
230 
231  if (endptr == value) {
232  parser_emit_error("Value '%s' is not a number\n", value);
233  }
234 
235  return val;
236 }
237 
238 #define SIZEOF_CWIDX sizeof(struct m0_workload_index)
239 #define SIZEOF_CWIO sizeof(struct m0_workload_io)
240 
241 #define workload_index(t) (t->u.cw_index)
242 #define workload_io(t) (t->u.cw_io)
243 
244 const char conf_section_name[] = "MOTR_CONFIG";
245 
246 int copy_value(struct workload *load, int max_workload, int *index,
247  char *key, char *value)
248 {
249  int value_len = strlen(value);
250  struct workload *w = NULL;
251  struct m0_fid *obj_fid;
252  struct m0_workload_io *cw;
253  struct m0_workload_index *ciw;
254 
256  if (conf != NULL) {
257  cr_log(CLL_ERROR, "YAML file error: "
258  "more than one config sections\n");
259  return -EINVAL;
260  }
261 
262  conf = m0_alloc(sizeof(struct crate_conf));
263  if (conf == NULL)
264  return -ENOMEM;
265  }
266  if (conf == NULL) {
267  cr_log(CLL_ERROR, "YAML file error: %s section is missing\n",
269  return -EINVAL;
270  }
271 
272  if (get_index_from_key(key) > WORKLOAD_TYPE && *index < 0) {
273  cr_log(CLL_ERROR, "YAML file error: WORKLOAD_TYPE is missing "
274  "or is not going first in the workload section\n");
275  return -EINVAL;
276  }
277 
278  switch(get_index_from_key(key)) {
279  case LOCAL_ADDR:
280  conf->local_addr = m0_alloc(value_len + 1);
281  if (conf->local_addr == NULL)
282  return -ENOMEM;
283  strcpy(conf->local_addr, value);
284  break;
285  case HA_ADDR:
286  conf->ha_addr = m0_alloc(value_len + 1);
287  if (conf->ha_addr == NULL)
288  return -ENOMEM;
289  strcpy(conf->ha_addr, value);
290  break;
291  case PROF:
292  conf->prof = m0_alloc(value_len + 1);
293  if (conf->prof == NULL)
294  return -ENOMEM;
295  strcpy(conf->prof, value);
296  break;
297  case MAX_QUEUE_LEN:
298  conf->tm_recv_queue_min_len = atoi(value);
299  break;
300  case MAX_RPC_MSG:
301  conf->max_rpc_msg_size = atoi(value);
302  break;
303  case PROCESS_FID:
304  conf->process_fid = m0_alloc(value_len + 1);
305  if (conf->process_fid == NULL)
306  return -ENOMEM;
307  strcpy(conf->process_fid, value);
308  break;
309  case LAYOUT_ID:
310  conf->layout_id = atoi(value);
311  break;
312  case IS_OOSTORE:
313  conf->is_oostrore = atoi(value);
314  break;
315  case IS_READ_VERIFY:
316  conf->is_read_verify = atoi(value);
317  break;
318  case IDX_SERVICE_ID:
319  conf->index_service_id = atoi(value);
320  break;
321  case CASS_EP:
322  conf->cass_cluster_ep = m0_alloc(value_len + 1);
323  if (conf->cass_cluster_ep == NULL)
324  return -ENOMEM;
325  strcpy(conf->cass_cluster_ep, value);
326  break;
327  case CASS_KEYSPACE:
328  conf->cass_keyspace = m0_alloc(value_len + 1);
329  if ( conf->cass_keyspace == NULL)
330  return -ENOMEM;
331 
332  strcpy(conf->cass_keyspace, value);
333  break;
334  case CASS_COL_FAMILY:
335  conf->col_family = atoi(value);
336  break;
337  case ADDB_INIT:
338  conf->is_addb_init = atoi(value);
339  break;
340  case ADDB_SIZE:
341  conf->addb_size = getnum(value, "addb size");
342  break;
343  case LOG_LEVEL:
344  conf->log_level = parse_int(value, LOG_LEVEL);
345  break;
346  case WORKLOAD_TYPE:
347  (*index)++;
348  w = &load[*index];
349  if (atoi(value) == INDEX) {
350  w->cw_type = CWT_INDEX;
352  if (w->u.cw_io == NULL)
353  return -ENOMEM;
354  } else {
355  w->cw_type = CWT_IO;
356  w->u.cw_io = m0_alloc(SIZEOF_CWIO);
357  if (w->u.cw_io == NULL)
358  return -ENOMEM;
359  }
360  return workload_init(w, w->cw_type);
361  case SEED:
362  w = &load[*index];
363  if (w->cw_type == CWT_IO) {
364  cw = workload_io(w);
365  if (strcmp(value, "tstamp"))
366  w->cw_rstate = atoi(value);
367  } else {
368  ciw = workload_index(w);
369  if (!strcmp(value, "tstamp"))
370  ciw->seed = time(NULL);
371  else
372  ciw->seed = parse_int(value, SEED);
373  }
374  break;
375  case NR_THREADS:
376  w = &load[*index];
377  w->cw_nr_thread = atoi(value);
378  break;
379  case NUM_OPS:
380  w = &load[*index];
381  w->cw_ops = atoi(value);
382  break;
383  case NUM_IDX:
384  w = &load[*index];
385  ciw = workload_index(w);
386  ciw->num_index = atoi(value);
387  break;
388  case NUM_KVP:
389  w = &load[*index];
390  ciw = workload_index(w);
391  ciw->num_kvs = atoi(value);
392  break;
393  case PUT:
394  w = &load[*index];
395  ciw = workload_index(w);
397  break;
398  case GET:
399  w = &load[*index];
400  ciw = workload_index(w);
402  break;
403  case NEXT:
404  w = &load[*index];
405  ciw = workload_index(w);
407  break;
408  case DEL:
409  w = &load[*index];
410  ciw = workload_index(w);
412  break;
413  case NXRECORDS:
414  w = &load[*index];
415  ciw = workload_index(w);
416  if (!strcmp(value, "default"))
417  ciw->next_records = -1;
418  else
420  break;
421  case OP_COUNT:
422  w = &load[*index];
423  ciw = workload_index(w);
424  if (!strcmp(value, "unlimited"))
425  ciw->op_count = -1;
426  else
428  break;
429  case EXEC_TIME:
430  w = &load[*index];
431  if (w->cw_type == CWT_INDEX) {
432  ciw = workload_index(w);
433  if (!strcmp(value, "unlimited"))
434  ciw->exec_time = -1;
435  else
436  ciw->exec_time = parse_int(value,
437  EXEC_TIME);
438  } else {
439  cw = workload_io(w);
440  if (!strcmp(value, "unlimited"))
442  else
444  (long)0);
445  }
446  break;
447  case KEY_PREFIX:
448  w = &load[*index];
449  ciw = workload_index(w);
450  if (!strcmp(value, "random"))
451  ciw->key_prefix.f_container = -1;
452  else
454  break;
455  case KEY_ORDER:
456  w = &load[*index];
457  ciw = workload_index(w);
458  if (!strcmp(value, "ordered"))
459  ciw->keys_ordered = true;
460  else if (!strcmp(value, "random"))
461  ciw->keys_ordered = false;
462  else
463  parser_emit_error("Unkown key ordering: '%s'", value);
464  break;
465  case KEY_SIZE:
466  w = &load[*index];
467  ciw = workload_index(w);
468  if (strcmp(value, "random") == 0)
469  ciw->key_size = -1;
470  else
471  ciw->key_size = parse_int(value, KEY_SIZE);
472  break;
473  case VALUE_SIZE:
474  w = &load[*index];
475  ciw = workload_index(w);
476  if (strcmp(value, "random") == 0)
477  ciw->value_size = -1;
478  else {
480  if (strcmp(key, "RECORD_SIZE") == 0) {
481  cr_log(CLL_WARN, "RECORD_SIZE is being deprecated, use KEY_SIZE and VALUE_SIZE.\n");
482  ciw->value_size = ciw->value_size - ciw->key_size;
483  }
484  }
485  break;
486  case MAX_KEY_SIZE:
487  w = &load[*index];
488  ciw = workload_index(w);
490  break;
491  case MAX_VALUE_SIZE:
492  w = &load[*index];
493  ciw = workload_index(w);
495  if (strcmp(key, "MAX_RSIZE") == 0) {
496  cr_log(CLL_WARN, "MAX_RSIZE is being deprecated, use MAX_KEY_SIZE and MAX_VALUE_SIZE.\n");
497  ciw->max_value_size = ciw->max_value_size - ciw->max_key_size;
498  }
499  break;
500  case INDEX_FID:
501  w = &load[*index];
502  ciw = workload_index(w);
503  if (0 != m0_fid_sscanf(value, &ciw->index_fid)) {
504  parser_emit_error("Unable to parse fid: %s", value);
505  }
506  break;
507  case WARMUP_PUT_CNT:
508  w = &load[*index];
509  ciw = workload_index(w);
510  if (!strcmp(value, "all"))
511  ciw->warmup_put_cnt = -1;
512  else
514  break;
515  case WARMUP_DEL_RATIO:
516  w = &load[*index];
517  ciw = workload_index(w);
519  break;
520  case THREAD_OPS:
521  w = &load[*index];
522  cw = workload_io(w);
523  cw->cwi_share_object = atoi(value);
524  break;
525  case BLOCK_SIZE:
526  w = &load[*index];
527  cw = workload_io(w);
528  cw->cwi_bs = getnum(value, "block size");
529  break;
530  case BLOCKS_PER_OP:
531  w = &load[*index];
532  cw = workload_io(w);
533  cw->cwi_bcount_per_op = atol(value);
534  break;
535  case NR_OBJS:
536  w = &load[*index];
537  cw = workload_io(w);
538  cw->cwi_nr_objs = atoi(value);
539  break;
540  case MAX_NR_OPS:
541  w = &load[*index];
542  cw = workload_io(w);
543  cw->cwi_max_nr_ops = atoi(value);
544  break;
545  case IOSIZE:
546  w = &load[*index];
547  cw = workload_io(w);
548  cw->cwi_io_size = getnum(value, "io size");
549  break;
550  case SOURCE_FILE:
551  w = &load[*index];
552  cw = workload_io(w);
553  cw->cwi_filename = m0_alloc(value_len + 1);
554  strcpy(cw->cwi_filename, value);
555  break;
556  case RAND_IO:
557  w = &load[*index];
558  cw = workload_io(w);
559  cw->cwi_random_io = atoi(value);
560  break;
561  case POOL_FID:
562  w = &load[*index];
563  cw = workload_io(w);
564  if (0 != m0_fid_sscanf(value, &cw->cwi_pool_id)) {
565  parser_emit_error("Unable to parse fid: %s", value);
566  }
567  break;
568  case OPCODE:
569  w = &load[*index];
570  cw = workload_io(w);
571  cw->cwi_opcode = atoi(value);
572  if (conf->layout_id <= 0) {
573  cr_log(CLL_ERROR, "LAYOUT_ID is not set\n");
574  return -EINVAL;
575  }
576  cw->cwi_layout_id = conf->layout_id;
577  break;
578  case START_OBJ_ID:
579  w = &load[*index];
580  cw = workload_io(w);
582  if (strchr(value, ':') == NULL) {
583  cw->cwi_start_obj_id.u_lo = atoi(value);
584  break;
585  }
586  obj_fid = (struct m0_fid *)&cw->cwi_start_obj_id;
587  m0_fid_sscanf(value, obj_fid);
588  break;
589  case MODE:
590  w = &load[*index];
591  cw = workload_io(w);
592  cw->cwi_mode = atoi(value);
593  break;
594  case NR_ROUNDS:
595  w = &load[*index];
596  cw = workload_io(w);
597  cw->cwi_rounds = atoi(value);
598  break;
599  case IS_ENF_META:
600  conf->is_enf_meta = atoi(value);
601  break;
602  default:
603  break;
604  }
605  return 0;
606 }
607 
608 int parse_yaml_file(struct workload *load, int max_workload, int *index,
609  char *config_file)
610 {
611  FILE *fh;
612  int is_key = 0;
613  char key[MAX_KEY_LEN];
614  char *scalar_value;
615  int rc;
616 
617  yaml_parser_t parser;
618  yaml_token_t token;
619 
620  if (!yaml_parser_initialize(&parser)) {
621  cr_log(CLL_ERROR, "Failed to initialize parser!\n");
622  return -1;
623  }
624 
625  fh = fopen(config_file, "r");
626  if (fh == NULL) {
627  cr_log(CLL_ERROR, "Failed to open file!\n");
628  yaml_parser_delete(&parser);
629  return -1;
630  }
631 
632  yaml_parser_set_input_file(&parser, fh);
633 
634  do {
635  rc = 0;
636  yaml_parser_scan(&parser, &token);
637  switch (token.type) {
638  case YAML_KEY_TOKEN:
639  is_key = 1;
640  break;
641  case YAML_VALUE_TOKEN:
642  is_key = 0;
643  break;
644  case YAML_SCALAR_TOKEN:
645  scalar_value = (char *)token.data.scalar.value;
646  if (is_key) {
647  strcpy(key, scalar_value);
648  } else {
649  rc = copy_value(load, max_workload, index,
650  key, scalar_value);
651  }
652  break;
653  case YAML_NO_TOKEN:
654  rc = -EINVAL;
655  break;
656  default:
657  break;
658  }
659 
660  if (rc != 0) {
661  cr_log(CLL_ERROR, "Failed to parse %s\n", key);
662  yaml_token_delete(&token);
663  yaml_parser_delete(&parser);
664  fclose(fh);
665  return rc;
666  }
667 
668  if (token.type != YAML_STREAM_END_TOKEN)
669  yaml_token_delete(&token);
670 
671  } while (token.type != YAML_STREAM_END_TOKEN);
672 
673  yaml_token_delete(&token);
674  yaml_parser_delete(&parser);
675  fclose(fh);
676  return 0;
677 }
678 
679 /*
680  * Local variables:
681  * c-indentation-style: "K&R"
682  * c-basic-offset: 8
683  * tab-width: 8
684  * fill-column: 80
685  * scroll-step: 1
686  * End:
687  */
688 /*
689  * vim: tabstop=8 shiftwidth=8 noexpandtab textwidth=80 nowrap
690  */
def load()
Definition: hist.py:112
void * cw_index
Definition: workload.h:99
Definition: parser.c:94
uint32_t cwi_rounds
Definition: crate_client.h:176
#define NULL
Definition: misc.h:38
int32_t cwi_nr_objs
Definition: crate_client.h:175
Definition: idx_mock.c:52
const m0_time_t M0_TIME_NEVER
Definition: time.c:108
static uint64_t tag(uint8_t code, uint64_t id)
Definition: addb2.c:1047
static int parse_int_with_units(const char *value, enum config_key_val tag)
Definition: parser.c:210
uint64_t cwi_bs
Definition: crate_client.h:164
Definition: parser.c:73
struct m0_fid index_fid
Definition: crate_client.h:114
int const char const void * value
Definition: dir.c:325
struct m0_fid key_prefix
Definition: crate_client.h:102
Definition: parser.c:53
enum m0_md_lustre_logrec_type __attribute__
Definition: balloc.c:2745
Definition: conf.py:1
char * cwi_filename
Definition: crate_client.h:185
Definition: parser.c:70
int32_t cwi_opcode
Definition: crate_client.h:179
Definition: ub.c:49
int opcode_prcnt[CRATE_OP_TYPES]
Definition: crate_client.h:84
Definition: parser.c:95
m0_time_t m0_time(uint64_t secs, long ns)
Definition: time.c:41
int copy_value(struct workload *load, int max_workload, int *index, char *key, char *value)
Definition: parser.c:246
Definition: parser.c:69
unsigned cw_rstate
Definition: workload.h:79
enum config_key_val index
Definition: parser.c:104
unsigned long long getnum(const char *str, const char *msg)
Definition: crate_utils.c:222
const struct m0_uint128 M0_ID_APP
Definition: client.c:92
enum config_key_val get_index_from_key(char *key)
Definition: parser.c:167
cr_kvs_key_len_max
Definition: parser.c:33
unsigned cw_ops
Definition: workload.h:76
union workload::@328 u
int i
Definition: dir.c:1033
uint32_t cwi_bcount_per_op
Definition: crate_client.h:169
def args
Definition: addb2db.py:716
void * cw_io
Definition: workload.h:98
struct crate_conf * conf
if(value==NULL)
Definition: dir.c:350
Definition: parser.c:74
const char conf_section_name[]
Definition: parser.c:244
#define m0_streq(a, b)
Definition: string.h:34
void parser_emit_error(const char *fmt,...) __attribute__((no_exit)) __attribute__((format(printf
Definition: parser.c:200
#define NKEYS
Definition: parser.c:165
config_key_val
Definition: parser.c:41
parser
Definition: queues.py:206
char * fmt(const char *format,...) __attribute__((format(printf
void * m0_alloc(size_t size)
Definition: memory.c:126
uint64_t f_container
Definition: fid.h:39
Definition: parser.c:67
static void token(struct ff2c_context *ctx, struct ff2c_term *term, struct ff2c_token *tok)
Definition: parser.c:66
struct m0_fid cwi_pool_id
Definition: crate_client.h:170
Definition: parser.c:97
#define workload_index(t)
Definition: parser.c:241
M0_INTERNAL int m0_fid_sscanf(const char *s, struct m0_fid *fid)
Definition: fid.c:227
Definition: parser.c:75
int parse_yaml_file(struct workload *load, int max_workload, int *index, char *config_file)
Definition: parser.c:608
int32_t cwi_mode
Definition: crate_client.h:174
unsigned cw_nr_thread
Definition: workload.h:78
#define SIZEOF_CWIO
Definition: parser.c:239
char * key
Definition: parser.c:103
format
Definition: hist.py:128
Definition: parser.c:71
struct workload_type_ops index_ops
Definition: fid.h:38
#define SIZEOF_CWIDX
Definition: parser.c:238
struct m0_uint128 cwi_start_obj_id
Definition: crate_client.h:180
uint32_t cwi_max_nr_ops
Definition: crate_client.h:173
static void workload_init(struct sim *s, int argc, char **argv)
Definition: m0t1fs_test.c:99
static int parse_int(const char *value, enum config_key_val tag)
Definition: parser.c:220
Definition: parser.c:44
void cr_log(enum cr_log_level lev, const char *fmt,...)
Definition: logger.c:39
Definition: parser.c:72
Definition: parser.c:76
enum cr_workload_type cw_type
Definition: workload.h:74
uint32_t cwi_layout_id
Definition: crate_client.h:162
uint64_t cwi_io_size
Definition: crate_client.h:171
struct key_lookup_table lookuptable[]
Definition: parser.c:107
Definition: parser.c:45
struct workload_type_ops ops
Definition: io_foms.c:623
uint64_t u_lo
Definition: types.h:37
Definition: parser.c:92
#define workload_io(t)
Definition: parser.c:242
int32_t rc
Definition: trigger_fop.h:47
const char * get_key_from_index(const enum config_key_val key)
Definition: parser.c:181
m0_time_t cwi_execution_time
Definition: crate_client.h:183
Definition: idx_mock.c:47