Motr  M0
main.c
Go to the documentation of this file.
1 #include <assert.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5 #include <clovis/clovis.h>
6 #include <clovis/clovis_internal.h>
7 #include "lib/trace.h"
8 #include "fdmi/fdmi.h"
9 #include "fdmi/service.h"
10 #include "fdmi/plugin_dock.h"
12 #include "reqh/reqh.h"
13 
14 #define NOBJS 40
15 
16 #define SMALL_UNIT_SIZE (4096) // Default layout.
17 #define LARGE_UNIT_SIZE (1024*4096) // Large layout.
18 
19 struct m0_clovis_realm my_realm;
20 static uint64_t small_layout;
21 static uint64_t large_layout;
22 
23 static int large_count;
24 static int small_count;
25 static struct m0_clovis *m0c;
26 static struct m0_pool pool;
27 
28 static struct m0_fid CLASSIFY_PLUGIN_FID = {
30  .f_key = 0x1
31 };
32 
33 static int
34 m0_write_n_blocks(int nblocks,
35  int unit_size, struct m0_clovis_obj *obj, int off, void *data)
36 {
37  int rc;
38  struct m0_indexvec ivec;
39  struct m0_bufvec bvec;
40  struct m0_bufvec attr;
41  struct m0_clovis_op *ops[1] = { NULL };
42 
43  rc = m0_bufvec_alloc(&bvec, 1, nblocks * unit_size);
44  if (rc != 0)
45  return rc;
46  rc = m0_bufvec_alloc(&attr, 1, 1);
47  if (rc != 0)
48  return rc;
49  rc = m0_indexvec_alloc(&ivec, 1);
50  if (rc != 0)
51  return rc;
52 
53  ivec.iv_index[0] = off * unit_size;
54  ivec.iv_vec.v_count[0] = unit_size * nblocks;
55  attr.ov_vec.v_count[0] = 0;
56 
57  for (int i = 0; i < nblocks; i++) {
58  memcpy(((char *)bvec.ov_buf[0]) + i * unit_size,
59  (char *)data, unit_size);
60  }
61 
62  m0_clovis_obj_op(obj, M0_CLOVIS_OC_WRITE, &ivec, &bvec, &attr, 0,
63  &ops[0]);
64 
65  m0_clovis_op_launch(ops, 1);
66 
67  rc = m0_clovis_op_wait(ops[0],
68  M0_BITS(M0_CLOVIS_OS_FAILED,
69  M0_CLOVIS_OS_STABLE), M0_TIME_NEVER);
70 
71  rc = m0_clovis_rc(ops[0]);
72 
73  m0_clovis_op_fini(ops[0]);
74  m0_clovis_op_free(ops[0]);
75 
76  return rc;
77 }
78 
79 static int m0_open_obj(struct m0_clovis_obj *obj)
80 {
81  struct m0_clovis_op *open_op[1] = { NULL };
82  int rc;
83 
84  m0_clovis_entity_open(&obj->ob_entity, &open_op[0]);
85  m0_clovis_op_launch(open_op, 1);
86 
87  m0_clovis_op_wait(open_op[0], M0_BITS(M0_CLOVIS_OS_FAILED,
88  M0_CLOVIS_OS_STABLE),
90  rc = m0_clovis_rc(open_op[0]);
91 
92  printf("open rc=%d\n", rc);
93  m0_clovis_op_fini(open_op[0]);
94  m0_clovis_op_free(open_op[0]);
95 
96  return rc;
97 }
98 
99 static int
100 m0_create_obj(struct m0_uint128 id, int layout, struct m0_clovis_obj *obj)
101 {
102  int rc;
103  struct m0_clovis_op *ops[1] = { NULL };
104 
105  memset(obj, 0, sizeof(struct m0_clovis_obj));
106 
107  m0_clovis_obj_init(obj, &my_realm, &id, layout);
108 
109  m0_clovis_entity_create(&obj->ob_entity, &ops[0]);
110 
111  m0_clovis_op_launch(ops, 1);
112 
113  m0_clovis_op_wait(ops[0],
114  M0_BITS(M0_CLOVIS_OS_FAILED, M0_CLOVIS_OS_STABLE),
115  M0_TIME_NEVER);
116 
117  rc = m0_clovis_rc(ops[0]);
118 
119  m0_clovis_op_fini(ops[0]);
120  m0_clovis_op_free(ops[0]);
121 
122  return rc;
123 }
124 
125 void list_container(struct m0_uint128 container_id)
126 {
127  struct m0_bufvec keys;
128  struct m0_clovis_container cont;
129  struct m0_clovis_op *op = NULL;
130  int rc, rcs[1];
131 
132  rc = m0_bufvec_alloc(&keys, 41, sizeof(struct m0_fid));
133 
134  m0_clovis_container_init(&cont, &my_realm, &container_id, m0c, &pool);
135  rc = m0_clovis_container_op(&cont, M0_CLOVIS_IC_LIST, &keys, NULL, rcs,
136  0, &op);
137  m0_clovis_op_launch(&op, 1);
138  rc = m0_clovis_op_wait(op, M0_BITS(M0_CLOVIS_OS_STABLE), M0_TIME_NEVER);
139 
140  if (rc < 0) {
141  fprintf(stderr, "Failed to list container items.\n");
142  } else {
143  for (int i = 0; i < keys.ov_vec.v_nr; i++) {
144  printf("%s\n", (char *)keys.ov_buf[i]);
145  }
146  }
147 
148  m0_bufvec_free(&keys);
149 }
150 
151 int main(int argc, char **argv)
152 {
153  int rc;
154 
155  if (argc < 5)
156  return -1;
157 
158  struct m0_idx_dix_config idx_service_conf = {
159  .kc_create_meta = false
160  };
161  struct m0_fid pver = M0_FID_TINIT('v', 1, 100);
162  struct m0_ext range[] = { {.e_start = 0,.e_end = IMASK_INF} };
163  rc = m0_dix_ldesc_init(&idx_service_conf.kc_layout_ldesc, range,
164  ARRAY_SIZE(range), HASH_FNC_FNV1, &pver);
165  rc = m0_dix_ldesc_init(&idx_service_conf.kc_ldescr_ldesc, range,
166  ARRAY_SIZE(range), HASH_FNC_FNV1, &pver);
167 
168  struct m0_clovis_config cfg = {
169  .cc_is_oostore = true,
170  .cc_is_read_verify = false,
171  .cc_ha_addr = argv[1], // IP@tcp:12345:45:1
172  .cc_local_addr = argv[2], // IP@tcp:12345:44:101
173  .cc_profile = argv[3], // <0x7000000000000001:0>
174  .cc_process_fid = argv[4], // <0x7200000000000000:0>
175  .cc_tm_recv_queue_min_len = M0_NET_TM_RECV_QUEUE_DEF_LEN,
176  .cc_max_rpc_msg_size = M0_RPC_DEF_MAX_RPC_MSG_SIZE,
177  .cc_idx_service_id = M0_CLOVIS_IDX_DIX, // Using DIX, not default dummy
178  // index.
179  .cc_idx_service_conf = (void *)&idx_service_conf
180  };
181 
182  rc = m0_clovis_init(&m0c, &cfg, true);
183 
184  if (rc < 0)
185  return rc;
186 
187  small_layout = m0_clovis_default_layout_id(m0c);
188  large_layout = 11;
189 
190  m0_clovis_realm_init(&my_realm,
191  NULL, &M0_CLOVIS_UBER_REALM,
192  M0_CLOVIS_ST_CONTAINER, m0c);
193 
194  printf("Clovis init OK. Creating %d objects...\n", NOBJS);
195 
196  // Block of 4MiB
197  char *data = (char *)malloc(LARGE_UNIT_SIZE);
198  for (int i = 0; i < LARGE_UNIT_SIZE; i++)
199  data[i] = i % 128;
200 
201  for (int i = 0; i < NOBJS; i++) {
202  bool large = rand() > RAND_MAX / 2;
203  int layout = large ? large_layout : small_layout;
204 
205  struct m0_clovis_obj obj;
206  struct m0_uint128 obj_id = M0_CLOVIS_ID_APP;
207 
208  obj_id.u_lo += i + 1;
209  printf("Creating %s object #%d... ", large ? "large" : "small",
210  i + 1);
211 
212  rc = m0_create_obj(obj_id, layout, &obj);
213  if (rc) {
214  continue;
215  }
216 
217  m0_open_obj(&obj);
218  rc = m0_write_n_blocks(1, // Nblocks
219  large ? LARGE_UNIT_SIZE : SMALL_UNIT_SIZE, &obj, 0, // Offset
220  data);
221 
222  if (rc) {
223  fprintf(stderr,
224  "Failed writing object %d (rc=%d). Skipping...\n",
225  i + 1, rc);
226  continue;
227  }
228  }
229 
230  printf("Listing containers.\n ");
231  struct m0_clovis_container small_cont;
232  struct m0_clovis_container large_cont;
233  struct m0_uint128 small_cont_id = M0_CLOVIS_ID_APP;
234  struct m0_uint128 large_cont_id = M0_CLOVIS_ID_APP;
235  small_cont_id.u_hi = small_cont_id.u_hi + 1;
236  large_cont_id.u_hi = large_cont_id.u_hi + 2;
237 
238  getchar();
239  printf("==================\n");
240  printf("SMALL OBJECTS: \n");
241  printf("==================\n");
242  list_container(small_cont_id);
243 
244  getchar();
245  printf("==================\n");
246  printf("LARGE OBJECTS: \n");
247  printf("==================\n");
248  list_container(large_cont_id);
249 
250  free(data);
251 
252  m0_clovis_fini(m0c, false);
253  printf("End of program\n");
254 
255  return rc;
256 }
#define SMALL_UNIT_SIZE
Definition: main.c:16
M0_INTERNAL int m0_indexvec_alloc(struct m0_indexvec *ivec, uint32_t len)
Definition: vec.c:532
struct m0_dix_ldesc kc_layout_ldesc
Definition: idx.h:189
#define NULL
Definition: misc.h:38
const m0_time_t M0_TIME_NEVER
Definition: time.c:108
struct m0_vec ov_vec
Definition: vec.h:147
struct m0_bufvec data
Definition: di.c:40
static struct m0_clovis * m0c
Definition: main.c:25
#define M0_BITS(...)
Definition: misc.h:236
static uint64_t small_layout
Definition: main.c:20
void ** ov_buf
Definition: vec.h:149
static struct foo * obj
Definition: tlist.c:302
static uint64_t large_layout
Definition: main.c:21
M0_INTERNAL int m0_bufvec_alloc(struct m0_bufvec *bufvec, uint32_t num_segs, m0_bcount_t seg_size)
Definition: vec.c:220
struct m0_vec iv_vec
Definition: vec.h:139
op
Definition: libdemo.c:64
static struct m0_clovis_container large_cont
Definition: main.c:472
static uint32_t unit_size
Definition: layout.c:53
static struct m0_fid CLASSIFY_PLUGIN_FID
Definition: main.c:28
M0_INTERNAL void m0_bufvec_free(struct m0_bufvec *bufvec)
Definition: vec.c:395
m0_bindex_t * iv_index
Definition: vec.h:141
int i
Definition: dir.c:1033
#define M0_FID_TINIT(type, container, key)
Definition: fid.h:90
static void attr(struct m0_addb2__context *ctx, const uint64_t *v, char *buf)
Definition: dump.c:949
static int large_count
Definition: main.c:23
struct m0_fid pver
Definition: idx_dix.c:74
static struct m0_bufvec bvec
Definition: xcode.c:169
int rand(void)
M0_INTERNAL int m0_dix_ldesc_init(struct m0_dix_ldesc *ld, struct m0_ext *range, m0_bcount_t range_nr, enum m0_dix_hash_fnc_type htype, struct m0_fid *pver)
Definition: layout.c:171
uint64_t u_hi
Definition: types.h:36
static struct m0_pool pool
Definition: main.c:26
uint64_t f_container
Definition: fid.h:39
static int m0_open_obj(struct m0_clovis_obj *obj)
Definition: main.c:79
uint32_t v_nr
Definition: vec.h:51
struct m0_uint128 obj_id
Definition: example1.c:53
m0_bcount_t * v_count
Definition: vec.h:53
#define NOBJS
Definition: main.c:14
struct m0_dix_ldesc kc_ldescr_ldesc
Definition: idx.h:195
static struct m0_clovis_container small_cont
Definition: main.c:471
static int m0_write_n_blocks(int nblocks, int unit_size, struct m0_clovis_obj *obj, int off, void *data)
Definition: main.c:34
#define LARGE_UNIT_SIZE
Definition: main.c:17
Definition: ext.h:37
Definition: fid.h:38
m0_bindex_t e_start
Definition: ext.h:39
bool kc_create_meta
Definition: idx.h:183
struct m0_clovis_realm my_realm
Definition: main.c:19
void list_container(struct m0_uint128 container_id)
Definition: main.c:125
static int m0_create_obj(struct m0_uint128 id, int layout, struct m0_clovis_obj *obj)
Definition: main.c:100
static int small_count
Definition: main.c:24
int main(int argc, char *argv[])
Definition: main.c:245
Definition: pool.h:80
struct m0_fom_ops ops
Definition: io_foms.c:623
uint64_t u_lo
Definition: types.h:37
int32_t rc
Definition: trigger_fop.h:47
#define ARRAY_SIZE(a)
Definition: misc.h:45
Definition: vec.h:145