Motr  M0
st.c
Go to the documentation of this file.
1 /* -*- C -*- */
2 /*
3  * Copyright (c) 2015-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 
35 #define M0_TRACE_SUBSYSTEM M0_TRACE_SUBSYS_BE
36 #include "lib/trace.h"
37 
38 #include "lib/memory.h" /* M0_ALLOC_ARR */
39 #include "lib/assert.h" /* M0_ASSERT */
40 #include "lib/types.h" /* UINT64_MAX */
41 #include "lib/time.h" /* m0_time_now */
42 #include "lib/misc.h" /* M0_SET0 */
43 
44 #include "be/ut/helper.h" /* m0_be_ut_backend */
45 #include "be/tool/common.h" /* m0_betool_m0_init */
46 
47 #include <stdlib.h>
48 #include <stdio.h> /* snprintf */
49 
50 enum {
51  BETOOL_ST_SEG_SIZE = 0x4000000, /* 64MiB */
52  BETOOL_ST_TX_STEP = 0x400000, /* 4MiB */
53  BETOOL_ST_CAPTURE_STEP = 0x20000, /* 128KiB */
54  BETOOL_ST_CAPTURE_BLOCK = 0x1F000, /* 124KiB */
55 };
56 
58 {
59  struct m0_be_ut_backend ut_be = {};
60  struct m0_be_seg *seg;
61 
65  &seg);
68  return 0;
69 }
70 
72  struct m0_be_seg *seg,
73  uint64_t *fill)
74 {
75  uint64_t start;
76  uint64_t pos;
77  uint64_t tx_value;
78  uint64_t *tx_values;
79  uint64_t *value;
80  int tx_values_nr;
81  int i;
82  int j;
83  int jump_nr;
84  int tx_first;
85  int tx_last;
86 
87  M0_LOG(M0_DEBUG, "check that value is the same for each capture block");
89  tx_values_nr = BETOOL_ST_SEG_SIZE / BETOOL_ST_TX_STEP;
90  M0_ALLOC_ARR(tx_values, tx_values_nr);
91  M0_ASSERT(tx_values != NULL);
92  for (pos = start; pos < BETOOL_ST_SEG_SIZE; pos += BETOOL_ST_TX_STEP) {
93  value = seg->bs_addr + pos;
94  tx_value = *value;
95  tx_values[pos / BETOOL_ST_TX_STEP] = tx_value;
96  M0_LOG(M0_ALWAYS, "tx_value=%"PRIu64, tx_value);
97  for (i = 0; i < BETOOL_ST_TX_STEP;
99  value = seg->bs_addr + pos + i;
100  for (j = 0; j < BETOOL_ST_CAPTURE_BLOCK /
101  sizeof *value; ++j) {
102  if (value[j] != tx_value) {
103  M0_LOG(M0_ALWAYS, "step offset = %d "
104  "capture block index = %d "
105  "value[j]=%" PRIu64 " "
106  "tx_value = %"PRIu64,
107  i, j, value[j], tx_value);
108  M0_IMPOSSIBLE("data mismatch");
109  }
110  }
111  }
112  }
113  *fill = 0;
114  jump_nr = 0;
115  tx_first = tx_values_nr;
116  tx_last = -1;
117  for (i = 0; i < tx_values_nr; ++i) {
118  if (tx_values[i] != 0) {
119  tx_first = i;
120  break;
121  }
122  }
123  for (i = tx_values_nr - 1; i >= 0; --i) {
124  if (tx_values[i] != 0) {
125  tx_last = i;
126  break;
127  }
128  }
129  M0_LOG(M0_ALWAYS, "tx_first=%d tx_last=%d", tx_first, tx_last);
130  for (i = tx_first; i <= tx_last; ++i) {
131  if (i > 0 && tx_values[i - 1] > tx_values[i]) {
132  M0_LOG(M0_ALWAYS, "jump from %" PRIu64 " to %"PRIu64,
133  *fill, tx_values[i]);
134  if (*fill != 0)
135  ++jump_nr;
136  M0_ASSERT(jump_nr <= 1);
137  }
138  *fill = max_check(tx_values[i], *fill);
139  }
140  ++*fill;
141  m0_free(tx_values);
142 }
143 
152 };
153 
154 static const char *betool_st_event_descr[] = {
155  "begin",
156  "tx open",
157  "fill",
158  "tx capture",
159  "tx close&wait",
160  "end",
161 };
163 
164 static void betool_st_event_time(m0_time_t *time,
165  enum betool_st_event event)
166 {
167  time[event] = m0_time_now();
168 }
169 
171  const char *info,
172  uint64_t fill)
173 {
174  char buf[0x100];
175  size_t len = sizeof buf;
176  int idx = 0;
177  int printed;
178  int i;
179 
180  printed = snprintf(buf, ARRAY_SIZE(buf), "%s fill: %"PRIu64,
181  info, fill);
182  for (i = 1; i < BETOOL_ST_TIME_NR; ++i) {
183  len -= printed;
184  idx += printed;
185  M0_ASSERT(buf[idx] == '\0');
186  printed = snprintf(&buf[idx], len, " %s: +%" PRIu64 "us",
188  (time[i] - time[0]) / 1000);
189  M0_ASSERT(printed >= 0);
190  }
191  M0_LOG(M0_ALWAYS, "%s", (const char *)buf);
192 }
193 
194 /* pass fill_end = UINT64_MAX for the infinite loop */
196  struct m0_be_seg *seg,
197  uint64_t fill,
198  uint64_t fill_end)
199 {
200  struct m0_be_tx_credit cred;
201  struct m0_be_reg reg;
202  struct m0_be_tx *tx;
203  m0_time_t *time;
204  uint64_t start;
205  uint64_t tx_start;
206  uint64_t ringbuf_steps;
207  uint64_t *value;
208  int step_nr;
209  int rc;
210  int i;
211  int j;
212 
213  M0_ALLOC_PTR(tx);
214  M0_ASSERT(tx != NULL);
216  M0_ASSERT(time != NULL);
218  cred = M0_BE_TX_CREDIT(step_nr, BETOOL_ST_CAPTURE_BLOCK * step_nr);
220  ringbuf_steps = (BETOOL_ST_SEG_SIZE - start) / BETOOL_ST_TX_STEP;
221  M0_LOG(M0_ALWAYS, "cred = "BETXCR_F, BETXCR_P(&cred));
222  for (; fill < fill_end; ++fill) {
224 
225  tx_start = start + BETOOL_ST_TX_STEP * (fill % ringbuf_steps);
226  M0_SET0(tx);
227  m0_be_ut_tx_init(tx, ut_be);
228  m0_be_tx_prep(tx, &cred);
229  rc = m0_be_tx_open_sync(tx);
230  M0_ASSERT_INFO(rc == 0, "rc=%d", rc);
232 
233  for (i = 0; i < BETOOL_ST_TX_STEP;
235  value = seg->bs_addr + tx_start + i;
236  for (j = 0;
237  j < BETOOL_ST_CAPTURE_BLOCK / sizeof *value; ++j)
238  value[j] = fill;
239  }
241 
242  for (i = 0; i < BETOOL_ST_TX_STEP;
245  seg->bs_addr + tx_start + i);
246  m0_be_tx_capture(tx, &reg);
247  }
249 
252 
253  m0_be_tx_fini(tx);
255  betool_st_event_time_print(time, "cycle", fill);
256  }
257  m0_free(time);
258  m0_free(tx);
259 }
260 
262 {
263  struct m0_be_ut_backend ut_be = {};
264  struct m0_be_domain_cfg cfg = {};
265  struct m0_be_seg *seg;
266  uint64_t fill_start;
267 
270  M0_LOG(M0_ALWAYS, "recovering...");
271  m0_be_ut_backend_init_cfg(&ut_be, &cfg, false);
272  M0_LOG(M0_ALWAYS, "recovered.");
274  M0_LOG(M0_ALWAYS, "segment with addr=%p and size=%" PRIu64 " found",
275  seg->bs_addr, seg->bs_size);
277  "seg->bs_size=%" PRIu64 " BETOOL_ST_SEG_SIZE=%d",
279  betool_st_data_check(&ut_be, seg, &fill_start);
280  betool_st_data_write(&ut_be, seg, fill_start, UINT64_MAX);
281  // betool_st_data_write(&ut_be, seg, fill_start, 10000);
284  return 0;
285 }
286 
287 #undef M0_TRACE_SUBSYSTEM
288 
291 /*
292  * Local variables:
293  * c-indentation-style: "K&R"
294  * c-basic-offset: 8
295  * tab-width: 8
296  * fill-column: 80
297  * scroll-step: 1
298  * End:
299  */
300 /*
301  * vim: tabstop=8 shiftwidth=8 noexpandtab textwidth=80 nowrap
302  */
void * bs_addr
Definition: seg.h:71
#define M0_ALLOC_ARR(arr, nr)
Definition: memory.h:84
M0_INTERNAL int m0_be_ut_backend_init_cfg(struct m0_be_ut_backend *ut_be, const struct m0_be_domain_cfg *cfg, bool mkfs)
Definition: stubs.c:231
#define BETXCR_F
Definition: tx_credit.h:102
#define NULL
Definition: misc.h:38
static const char * betool_st_event_descr[]
Definition: st.c:154
int m0_betool_st_mkfs(void)
Definition: st.c:57
static void betool_st_data_write(struct m0_be_ut_backend *ut_be, struct m0_be_seg *seg, uint64_t fill, uint64_t fill_end)
Definition: st.c:195
uint64_t m0_time_t
Definition: time.h:37
#define M0_LOG(level,...)
Definition: trace.h:167
M0_INTERNAL void m0_be_tx_fini(struct m0_be_tx *tx)
Definition: stubs.c:163
m0_bcount_t bs_size
Definition: seg.h:69
#define max_check(a, b)
Definition: arith.h:95
int const char const void * value
Definition: dir.c:325
M0_INTERNAL void m0_be_tx_prep(struct m0_be_tx *tx, const struct m0_be_tx_credit *credit)
Definition: stubs.c:175
M0_INTERNAL void m0_be_ut_backend_seg_add2(struct m0_be_ut_backend *ut_be, m0_bcount_t size, bool preallocate, const char *stob_create_cfg, struct m0_be_seg **out)
Definition: helper.c:466
static int void * buf
Definition: dir.c:1019
#define M0_SET0(obj)
Definition: misc.h:64
#define M0_BE_REG(seg, size, addr)
Definition: seg.h:148
Definition: sock.c:887
M0_INTERNAL uint64_t m0_round_up(uint64_t val, uint64_t size)
Definition: misc.c:181
#define M0_BE_TX_CREDIT(nr, size)
Definition: tx_credit.h:94
M0_INTERNAL m0_bcount_t m0_be_seg_reserved(const struct m0_be_seg *seg)
Definition: seg.c:430
int i
Definition: dir.c:1033
#define PRIu64
Definition: types.h:58
void m0_be_ut_backend_cfg_default(struct m0_be_domain_cfg *cfg)
Definition: stubs.c:227
struct m0_be_ut_backend ut_be
Definition: ad.c:72
static void betool_st_event_time(m0_time_t *time, enum betool_st_event event)
Definition: st.c:164
#define M0_ASSERT(cond)
void m0_betool_m0_fini(void)
Definition: common.c:52
m0_time_t m0_time_now(void)
Definition: time.c:134
M0_INTERNAL int m0_be_tx_open_sync(struct m0_be_tx *tx)
Definition: stubs.c:199
void m0_be_ut_backend_init(struct m0_be_ut_backend *ut_be)
Definition: stubs.c:238
M0_BASSERT(ARRAY_SIZE(betool_st_event_descr)==BETOOL_ST_TIME_NR)
betool_st_event
Definition: st.c:144
#define UINT64_MAX
Definition: types.h:44
int m0_betool_st_run(void)
Definition: st.c:261
#define BETXCR_P(c)
Definition: tx_credit.h:113
Definition: seg.h:66
Definition: seg.h:142
struct m0_be_domain but_dom
Definition: helper.h:47
#define M0_ALLOC_PTR(ptr)
Definition: memory.h:86
void m0_be_ut_tx_init(struct m0_be_tx *tx, struct m0_be_ut_backend *ut_be)
Definition: stubs.c:286
static int start(struct m0_fom *fom)
Definition: trigger_fom.c:321
static void betool_st_event_time_print(m0_time_t *time, const char *info, uint64_t fill)
Definition: st.c:170
void m0_be_ut_backend_fini(struct m0_be_ut_backend *ut_be)
Definition: stubs.c:242
static struct m0_be_seg * seg
Definition: btree.c:40
#define M0_ASSERT_INFO(cond, fmt,...)
M0_INTERNAL struct m0_be_seg * m0_be_domain_seg_first(const struct m0_be_domain *dom)
Definition: domain.c:486
M0_INTERNAL void m0_be_tx_capture(struct m0_be_tx *tx, const struct m0_be_reg *reg)
Definition: stubs.c:190
void m0_betool_m0_init(void)
Definition: common.c:42
void m0_free(void *data)
Definition: memory.c:146
int32_t rc
Definition: trigger_fop.h:47
#define ARRAY_SIZE(a)
Definition: misc.h:45
static void betool_st_data_check(struct m0_be_ut_backend *ut_be, struct m0_be_seg *seg, uint64_t *fill)
Definition: st.c:71
M0_INTERNAL void m0_be_tx_close_sync(struct m0_be_tx *tx)
Definition: stubs.c:205
Definition: tx.h:280
#define M0_IMPOSSIBLE(fmt,...)