mdbxmou 0.1.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) hide show
  1. package/.github/workflows/ci.yml +32 -0
  2. package/.github/workflows/publish.yml +27 -0
  3. package/.gitmodules +3 -0
  4. package/CMakeLists.txt +53 -0
  5. package/LICENSE +201 -0
  6. package/README.md +639 -0
  7. package/build.js +11 -0
  8. package/deps/libmdbx/.clang-format +3 -0
  9. package/deps/libmdbx/.cmake-format.yaml +3 -0
  10. package/deps/libmdbx/.le.ini +40 -0
  11. package/deps/libmdbx/CMakeLists.txt +1269 -0
  12. package/deps/libmdbx/COPYRIGHT +159 -0
  13. package/deps/libmdbx/ChangeLog.md +2786 -0
  14. package/deps/libmdbx/GNUmakefile +950 -0
  15. package/deps/libmdbx/LICENSE +177 -0
  16. package/deps/libmdbx/Makefile +16 -0
  17. package/deps/libmdbx/NOTICE +39 -0
  18. package/deps/libmdbx/README.md +863 -0
  19. package/deps/libmdbx/TODO.md +43 -0
  20. package/deps/libmdbx/cmake/compiler.cmake +1221 -0
  21. package/deps/libmdbx/cmake/profile.cmake +58 -0
  22. package/deps/libmdbx/cmake/utils.cmake +524 -0
  23. package/deps/libmdbx/conanfile.py +323 -0
  24. package/deps/libmdbx/docs/Doxyfile.in +2734 -0
  25. package/deps/libmdbx/docs/_preface.md +47 -0
  26. package/deps/libmdbx/docs/_restrictions.md +248 -0
  27. package/deps/libmdbx/docs/_starting.md +245 -0
  28. package/deps/libmdbx/docs/_toc.md +34 -0
  29. package/deps/libmdbx/docs/header.html +96 -0
  30. package/deps/libmdbx/example/CMakeLists.txt +6 -0
  31. package/deps/libmdbx/example/README.md +1 -0
  32. package/deps/libmdbx/example/example-mdbx.c +154 -0
  33. package/deps/libmdbx/example/sample-bdb.txt +77 -0
  34. package/deps/libmdbx/mdbx.h +6655 -0
  35. package/deps/libmdbx/mdbx.h++ +6428 -0
  36. package/deps/libmdbx/packages/buildroot/0001-package-libmdbx-new-package-library-database.patch +173 -0
  37. package/deps/libmdbx/src/alloy.c +54 -0
  38. package/deps/libmdbx/src/api-cold.c +543 -0
  39. package/deps/libmdbx/src/api-copy.c +912 -0
  40. package/deps/libmdbx/src/api-cursor.c +754 -0
  41. package/deps/libmdbx/src/api-dbi.c +315 -0
  42. package/deps/libmdbx/src/api-env.c +1434 -0
  43. package/deps/libmdbx/src/api-extra.c +165 -0
  44. package/deps/libmdbx/src/api-key-transform.c +197 -0
  45. package/deps/libmdbx/src/api-misc.c +286 -0
  46. package/deps/libmdbx/src/api-opts.c +575 -0
  47. package/deps/libmdbx/src/api-range-estimate.c +365 -0
  48. package/deps/libmdbx/src/api-txn-data.c +454 -0
  49. package/deps/libmdbx/src/api-txn.c +921 -0
  50. package/deps/libmdbx/src/atomics-ops.h +364 -0
  51. package/deps/libmdbx/src/atomics-types.h +97 -0
  52. package/deps/libmdbx/src/audit.c +109 -0
  53. package/deps/libmdbx/src/bits.md +34 -0
  54. package/deps/libmdbx/src/chk.c +1796 -0
  55. package/deps/libmdbx/src/cogs.c +309 -0
  56. package/deps/libmdbx/src/cogs.h +506 -0
  57. package/deps/libmdbx/src/coherency.c +170 -0
  58. package/deps/libmdbx/src/config.h.in +88 -0
  59. package/deps/libmdbx/src/cursor.c +2396 -0
  60. package/deps/libmdbx/src/cursor.h +391 -0
  61. package/deps/libmdbx/src/dbi.c +717 -0
  62. package/deps/libmdbx/src/dbi.h +142 -0
  63. package/deps/libmdbx/src/debug_begin.h +36 -0
  64. package/deps/libmdbx/src/debug_end.h +15 -0
  65. package/deps/libmdbx/src/dpl.c +486 -0
  66. package/deps/libmdbx/src/dpl.h +134 -0
  67. package/deps/libmdbx/src/dxb.c +1335 -0
  68. package/deps/libmdbx/src/env.c +607 -0
  69. package/deps/libmdbx/src/essentials.h +125 -0
  70. package/deps/libmdbx/src/gc-get.c +1345 -0
  71. package/deps/libmdbx/src/gc-put.c +970 -0
  72. package/deps/libmdbx/src/gc.h +40 -0
  73. package/deps/libmdbx/src/global.c +474 -0
  74. package/deps/libmdbx/src/internals.h +585 -0
  75. package/deps/libmdbx/src/layout-dxb.h +288 -0
  76. package/deps/libmdbx/src/layout-lck.h +289 -0
  77. package/deps/libmdbx/src/lck-posix.c +859 -0
  78. package/deps/libmdbx/src/lck-windows.c +607 -0
  79. package/deps/libmdbx/src/lck.c +174 -0
  80. package/deps/libmdbx/src/lck.h +110 -0
  81. package/deps/libmdbx/src/logging_and_debug.c +250 -0
  82. package/deps/libmdbx/src/logging_and_debug.h +159 -0
  83. package/deps/libmdbx/src/man1/mdbx_chk.1 +106 -0
  84. package/deps/libmdbx/src/man1/mdbx_copy.1 +95 -0
  85. package/deps/libmdbx/src/man1/mdbx_drop.1 +48 -0
  86. package/deps/libmdbx/src/man1/mdbx_dump.1 +101 -0
  87. package/deps/libmdbx/src/man1/mdbx_load.1 +105 -0
  88. package/deps/libmdbx/src/man1/mdbx_stat.1 +86 -0
  89. package/deps/libmdbx/src/mdbx.c++ +1837 -0
  90. package/deps/libmdbx/src/meta.c +656 -0
  91. package/deps/libmdbx/src/meta.h +168 -0
  92. package/deps/libmdbx/src/mvcc-readers.c +414 -0
  93. package/deps/libmdbx/src/node.c +365 -0
  94. package/deps/libmdbx/src/node.h +102 -0
  95. package/deps/libmdbx/src/ntdll.def +1246 -0
  96. package/deps/libmdbx/src/options.h +534 -0
  97. package/deps/libmdbx/src/osal.c +3485 -0
  98. package/deps/libmdbx/src/osal.h +587 -0
  99. package/deps/libmdbx/src/page-get.c +483 -0
  100. package/deps/libmdbx/src/page-iov.c +185 -0
  101. package/deps/libmdbx/src/page-iov.h +34 -0
  102. package/deps/libmdbx/src/page-ops.c +744 -0
  103. package/deps/libmdbx/src/page-ops.h +142 -0
  104. package/deps/libmdbx/src/pnl.c +236 -0
  105. package/deps/libmdbx/src/pnl.h +146 -0
  106. package/deps/libmdbx/src/preface.h +990 -0
  107. package/deps/libmdbx/src/proto.h +105 -0
  108. package/deps/libmdbx/src/refund.c +212 -0
  109. package/deps/libmdbx/src/sort.h +484 -0
  110. package/deps/libmdbx/src/spill.c +431 -0
  111. package/deps/libmdbx/src/spill.h +74 -0
  112. package/deps/libmdbx/src/table.c +107 -0
  113. package/deps/libmdbx/src/tls.c +551 -0
  114. package/deps/libmdbx/src/tls.h +43 -0
  115. package/deps/libmdbx/src/tools/chk.c +673 -0
  116. package/deps/libmdbx/src/tools/copy.c +166 -0
  117. package/deps/libmdbx/src/tools/drop.c +199 -0
  118. package/deps/libmdbx/src/tools/dump.c +515 -0
  119. package/deps/libmdbx/src/tools/load.c +831 -0
  120. package/deps/libmdbx/src/tools/stat.c +516 -0
  121. package/deps/libmdbx/src/tools/wingetopt.c +87 -0
  122. package/deps/libmdbx/src/tools/wingetopt.h +30 -0
  123. package/deps/libmdbx/src/tree-ops.c +1554 -0
  124. package/deps/libmdbx/src/tree-search.c +140 -0
  125. package/deps/libmdbx/src/txl.c +99 -0
  126. package/deps/libmdbx/src/txl.h +26 -0
  127. package/deps/libmdbx/src/txn.c +1083 -0
  128. package/deps/libmdbx/src/unaligned.h +205 -0
  129. package/deps/libmdbx/src/utils.c +32 -0
  130. package/deps/libmdbx/src/utils.h +76 -0
  131. package/deps/libmdbx/src/version.c.in +44 -0
  132. package/deps/libmdbx/src/walk.c +290 -0
  133. package/deps/libmdbx/src/walk.h +20 -0
  134. package/deps/libmdbx/src/windows-import.c +152 -0
  135. package/deps/libmdbx/src/windows-import.h +128 -0
  136. package/deps/libmdbx/test/CMakeLists.txt +317 -0
  137. package/deps/libmdbx/test/append.c++ +237 -0
  138. package/deps/libmdbx/test/base.h++ +92 -0
  139. package/deps/libmdbx/test/battery-tmux.sh +64 -0
  140. package/deps/libmdbx/test/cases.c++ +118 -0
  141. package/deps/libmdbx/test/chrono.c++ +134 -0
  142. package/deps/libmdbx/test/chrono.h++ +85 -0
  143. package/deps/libmdbx/test/config.c++ +643 -0
  144. package/deps/libmdbx/test/config.h++ +334 -0
  145. package/deps/libmdbx/test/copy.c++ +62 -0
  146. package/deps/libmdbx/test/dead.c++ +39 -0
  147. package/deps/libmdbx/test/dump-load.sh +40 -0
  148. package/deps/libmdbx/test/extra/crunched_delete.c++ +409 -0
  149. package/deps/libmdbx/test/extra/cursor_closing.c++ +410 -0
  150. package/deps/libmdbx/test/extra/dbi.c++ +229 -0
  151. package/deps/libmdbx/test/extra/doubtless_positioning.c++ +253 -0
  152. package/deps/libmdbx/test/extra/dupfix_addodd.c +94 -0
  153. package/deps/libmdbx/test/extra/dupfix_multiple.c++ +311 -0
  154. package/deps/libmdbx/test/extra/early_close_dbi.c++ +137 -0
  155. package/deps/libmdbx/test/extra/hex_base64_base58.c++ +118 -0
  156. package/deps/libmdbx/test/extra/maindb_ordinal.c++ +61 -0
  157. package/deps/libmdbx/test/extra/open.c++ +96 -0
  158. package/deps/libmdbx/test/extra/pcrf/README.md +2 -0
  159. package/deps/libmdbx/test/extra/pcrf/pcrf_test.c +380 -0
  160. package/deps/libmdbx/test/extra/probe.c++ +10 -0
  161. package/deps/libmdbx/test/extra/txn.c++ +407 -0
  162. package/deps/libmdbx/test/extra/upsert_alldups.c +193 -0
  163. package/deps/libmdbx/test/fork.c++ +263 -0
  164. package/deps/libmdbx/test/hill.c++ +447 -0
  165. package/deps/libmdbx/test/jitter.c++ +197 -0
  166. package/deps/libmdbx/test/keygen.c++ +393 -0
  167. package/deps/libmdbx/test/keygen.h++ +130 -0
  168. package/deps/libmdbx/test/log.c++ +358 -0
  169. package/deps/libmdbx/test/log.h++ +91 -0
  170. package/deps/libmdbx/test/main.c++ +706 -0
  171. package/deps/libmdbx/test/nested.c++ +318 -0
  172. package/deps/libmdbx/test/osal-unix.c++ +647 -0
  173. package/deps/libmdbx/test/osal-windows.c++ +440 -0
  174. package/deps/libmdbx/test/osal.h++ +41 -0
  175. package/deps/libmdbx/test/stochastic.sh +690 -0
  176. package/deps/libmdbx/test/stub/LICENSE +24 -0
  177. package/deps/libmdbx/test/stub/README.md +8 -0
  178. package/deps/libmdbx/test/stub/pthread_barrier.c +104 -0
  179. package/deps/libmdbx/test/stub/pthread_barrier.h +77 -0
  180. package/deps/libmdbx/test/test.c++ +1551 -0
  181. package/deps/libmdbx/test/test.h++ +298 -0
  182. package/deps/libmdbx/test/tmux.conf +3 -0
  183. package/deps/libmdbx/test/try.c++ +30 -0
  184. package/deps/libmdbx/test/ttl.c++ +240 -0
  185. package/deps/libmdbx/test/utils.c++ +203 -0
  186. package/deps/libmdbx/test/utils.h++ +326 -0
  187. package/deps/libmdbx/test/valgrind_suppress.txt +536 -0
  188. package/lib/mdbx_evn_async.js +211 -0
  189. package/lib/mdbx_worker.js +195 -0
  190. package/lib/nativemou.js +6 -0
  191. package/package.json +38 -0
  192. package/src/async/envmou_close.cpp +34 -0
  193. package/src/async/envmou_close.hpp +32 -0
  194. package/src/async/envmou_copy_to.cpp +29 -0
  195. package/src/async/envmou_copy_to.hpp +38 -0
  196. package/src/async/envmou_keys.cpp +201 -0
  197. package/src/async/envmou_keys.hpp +50 -0
  198. package/src/async/envmou_open.cpp +38 -0
  199. package/src/async/envmou_open.hpp +33 -0
  200. package/src/async/envmou_query.cpp +167 -0
  201. package/src/async/envmou_query.hpp +53 -0
  202. package/src/dbimou.cpp +522 -0
  203. package/src/dbimou.hpp +82 -0
  204. package/src/env_arg0.hpp +24 -0
  205. package/src/envmou.cpp +445 -0
  206. package/src/envmou.hpp +116 -0
  207. package/src/modulemou.cpp +113 -0
  208. package/src/querymou.cpp +177 -0
  209. package/src/querymou.hpp +93 -0
  210. package/src/txnmou.cpp +254 -0
  211. package/src/txnmou.hpp +122 -0
  212. package/src/typemou.hpp +239 -0
  213. package/src/valuemou.hpp +194 -0
  214. package/test/async.js +67 -0
  215. package/test/e3.js +38 -0
  216. package/test/e4.js +89 -0
  217. package/test/e5.js +162 -0
  218. package/test/test-batch-ops.js +243 -0
  219. package/test/test-cursor-mode.js +84 -0
  220. package/test/test-multi-mode.js +87 -0
@@ -0,0 +1,690 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Леонид Юрьев aka Leonid Yuriev <leo@yuriev.ru>
4
+ # SPDX-License-Identifier: Apache-2.0
5
+
6
+ if [ "${BASH_VERSION}" \< "4.3" ]; then
7
+ echo "Bash-shell 4.3 or later is REQUIRED." >&2
8
+ echo "Present Bash-shell version is '${BASH_VERSION}' (BASH_VERSION)" >&2
9
+ exit
10
+ fi
11
+
12
+ LIST=basic
13
+ FROM=1
14
+ UPTO=9999999
15
+ MONITOR=
16
+ LOOPS=
17
+ SKIP_MAKE=no
18
+ GEOMETRY_JITTER=yes
19
+ BANNER="$(which banner 2>/dev/null || echo echo)"
20
+ UNAME="$(uname -s 2>/dev/null || echo Unknown)"
21
+ DB_UPTO_MB=17408
22
+ PAGESIZE=min
23
+ DONT_CHECK_RAM=no
24
+ EXTRA=no
25
+ TAILLOG=0
26
+ DELAY=0
27
+ REPORT_DEPTH=no
28
+ REPEAT=11
29
+ ROUNDS=1
30
+ SMALL=no
31
+ NUMABIND=
32
+
33
+ while [ -n "$1" ]
34
+ do
35
+ case "$1" in
36
+ --help)
37
+ echo "--multi Engage multi-process test scenario (default)"
38
+ echo "--single Execute series of single-process tests (for QEMU, etc)"
39
+ echo "--nested Execute only 'nested' testcase"
40
+ echo "--hill Execute only 'hill' testcase"
41
+ echo "--append Execute only 'append' testcase"
42
+ echo "--ttl Execute only 'ttl' testcase"
43
+ echo "--with-valgrind Run tests under Valgrind's memcheck tool"
44
+ echo "--skip-make Don't (re)build libmdbx and test's executable"
45
+ echo "--from NN Start iterating from the NN ops per test case"
46
+ echo "--upto NN Don't run tests with more than NN ops per test case"
47
+ echo "--repeat NN Repeat each testcase NN times within test run"
48
+ echo "--rounds NN Cycle each n-ops/wbatch case NN times"
49
+ echo "--loops NN Stop after the NN loops"
50
+ echo "--dir PATH Specifies directory for test DB and other files (it will be cleared)"
51
+ echo "--db-upto-mb NN Limits upper size of test DB to the NN megabytes"
52
+ echo "--db-upto-gb NN --''--''--''--''--''--''--''--''-- NN gigabytes"
53
+ echo "--no-geometry-jitter Disable jitter for geometry upper-size"
54
+ echo "--pagesize NN Use specified page size (256 is minimal and used by default)"
55
+ echo "--numa NODE Bind to the specified NUMA node"
56
+ echo "--dont-check-ram-size Don't check available RAM"
57
+ echo "--extra Iterate extra modes/flags"
58
+ echo "--taillog Dump tail of test log on failure"
59
+ echo "--delay NN Delay NN seconds before run test"
60
+ echo "--report-depth Report tree depth (tee+grep log)"
61
+ echo "--small Small transactions/batch/nops pattern"
62
+ echo "--help Print this usage help and exit"
63
+ exit -2
64
+ ;;
65
+ --taillog)
66
+ TAILLOG=3333
67
+ ;;
68
+ --multi)
69
+ LIST=basic
70
+ ;;
71
+ --single)
72
+ LIST="--nested --hill --append --ttl --copy"
73
+ ;;
74
+ --nested)
75
+ LIST="--nested"
76
+ ;;
77
+ --hill)
78
+ LIST="--hill"
79
+ ;;
80
+ --append)
81
+ LIST="--append"
82
+ ;;
83
+ --ttl)
84
+ LIST="--ttl"
85
+ ;;
86
+ --with-valgrind)
87
+ echo " NOTE: Valgrind could produce some false-positive warnings"
88
+ echo " in multi-process environment with shared memory."
89
+ echo " For instance, when the process 'A' explicitly marks a memory"
90
+ echo " region as 'undefined', the process 'B' fill it,"
91
+ echo " and after this process 'A' read such region, etc."
92
+ MONITOR="valgrind --trace-children=yes --log-file=valgrind-%p.log --leak-check=full --track-origins=yes --read-var-info=yes --error-exitcode=42 --suppressions=test/valgrind_suppress.txt"
93
+ rm -f valgrind-*.log
94
+ ;;
95
+ --skip-make)
96
+ SKIP_MAKE=yes
97
+ ;;
98
+ --from)
99
+ FROM=$(($2))
100
+ if [ -z "$FROM" -o "$FROM" -lt 1 ]; then
101
+ echo "Invalid value '$FROM' for --from option"
102
+ exit -2
103
+ fi
104
+ shift
105
+ ;;
106
+ --upto)
107
+ UPTO=$(($2))
108
+ if [ -z "$UPTO" -o "$UPTO" -lt 1 ]; then
109
+ echo "Invalid value '$UPTO' for --upto option"
110
+ exit -2
111
+ fi
112
+ shift
113
+ ;;
114
+ --repeat|--reps|--rep)
115
+ REPEAT=$(($2))
116
+ if [ -z "$REPEAT" -o "$REPEAT" -lt 1 -o "$REPEAT" -gt 99 ]; then
117
+ echo "Invalid value '$REPEAT' for --repeat option"
118
+ exit -2
119
+ fi
120
+ shift
121
+ ;;
122
+ --rounds)
123
+ ROUNDS=$(($2))
124
+ if [ -z "$ROUNDS" -o "$ROUNDS" -lt 1 -o "$ROUNDS" -gt 99 ]; then
125
+ echo "Invalid value '$ROUNDS' for --rounds option"
126
+ exit -2
127
+ fi
128
+ shift
129
+ ;;
130
+ --loops)
131
+ LOOPS=$(($2))
132
+ if [ -z "$LOOPS" -o "$LOOPS" -lt 1 -o "$LOOPS" -gt 99 ]; then
133
+ echo "Invalid value '$LOOPS' for --loops option"
134
+ exit -2
135
+ fi
136
+ shift
137
+ ;;
138
+ --dir)
139
+ TESTDB_DIR="$2"
140
+ if [ -z "$TESTDB_DIR" ]; then
141
+ echo "Invalid value '$TESTDB_DIR' for --dir option"
142
+ exit -2
143
+ fi
144
+ shift
145
+ ;;
146
+ --db-upto-mb)
147
+ DB_UPTO_MB=$(($2))
148
+ if [ -z "$DB_UPTO_MB" -o "$DB_UPTO_MB" -lt 1 -o "$DB_UPTO_MB" -gt 4194304 ]; then
149
+ echo "Invalid value '$DB_UPTO_MB' for --db-upto-mb option"
150
+ exit -2
151
+ fi
152
+ shift
153
+ ;;
154
+ --db-upto-gb)
155
+ DB_UPTO_MB=$(($2 * 1024))
156
+ if [ -z "$DB_UPTO_MB" -o "$DB_UPTO_MB" -lt 1 -o "$DB_UPTO_MB" -gt 4194304 ]; then
157
+ echo "Invalid value '$2' for --db-upto-gb option"
158
+ exit -2
159
+ fi
160
+ shift
161
+ ;;
162
+ --no-geometry-jitter)
163
+ GEOMETRY_JITTER=no
164
+ ;;
165
+ --pagesize|--page-size)
166
+ case "$2" in
167
+ min|max|256|512|1024|2048|4096|8192|16386|32768|65536)
168
+ PAGESIZE=$2
169
+ ;;
170
+ 1|1k|1K|k|K)
171
+ PAGESIZE=$((1024*1))
172
+ ;;
173
+ 2|2k|2K)
174
+ PAGESIZE=$((1024*2))
175
+ ;;
176
+ 4|4k|4K)
177
+ PAGESIZE=$((1024*4))
178
+ ;;
179
+ 8|8k|8K)
180
+ PAGESIZE=$((1024*8))
181
+ ;;
182
+ 16|16k|16K)
183
+ PAGESIZE=$((1024*16))
184
+ ;;
185
+ 32|32k|32K)
186
+ PAGESIZE=$((1024*32))
187
+ ;;
188
+ 64|64k|64K)
189
+ PAGESIZE=$((1024*64))
190
+ ;;
191
+ *)
192
+ echo "Invalid page size '$2'"
193
+ exit -2
194
+ ;;
195
+ esac
196
+ shift
197
+ ;;
198
+ --dont-check-ram-size)
199
+ DONT_CHECK_RAM=yes
200
+ ;;
201
+ --extra)
202
+ EXTRA=yes
203
+ ;;
204
+ --delay)
205
+ DELAY=$(($2))
206
+ shift
207
+ ;;
208
+ --report-depth)
209
+ REPORT_DEPTH=yes
210
+ ;;
211
+ --small)
212
+ SMALL=yes
213
+ ;;
214
+ --numa)
215
+ NUMANODE=$2
216
+ if [[ ! $NUMANODE =~ ^[0-9]+$ ]]; then
217
+ echo "Invalid value '$NUMANODE' for --numa option, expect an integer of NUMA-node"
218
+ exit -2
219
+ fi
220
+ NUMABIND="numactl --membind ${NUMANODE} --cpunodebind ${NUMANODE}"
221
+ shift
222
+ ;;
223
+ *)
224
+ echo "Unknown option '$1'"
225
+ exit -2
226
+ ;;
227
+ esac
228
+ shift
229
+ done
230
+
231
+ set -euo pipefail
232
+ if [ -z "$MONITOR" ]; then
233
+ export MALLOC_CHECK_=7 MALLOC_PERTURB_=42
234
+ fi
235
+
236
+ if ! which $([ "$SKIP_MAKE" == "no" ] && echo make cc c++) tee >/dev/null; then
237
+ echo "Please install the following prerequisites: make cc c++ tee banner" >&2
238
+ exit 1
239
+ fi
240
+
241
+ ###############################################################################
242
+ # 1. clean data from prev runs and examine available RAM
243
+
244
+ WANNA_MOUNT=0
245
+ case ${UNAME} in
246
+ Linux)
247
+ MAKE=make
248
+ if [ -z "${TESTDB_DIR:-}" ]; then
249
+ for old_test_dir in $(ls -d /dev/shm/mdbx-test.[0-9]* 2>/dev/null); do
250
+ rm -rf $old_test_dir
251
+ done
252
+ TESTDB_DIR="/dev/shm/mdbx-test.$$"
253
+ fi
254
+ mkdir -p $TESTDB_DIR && rm -f $TESTDB_DIR/*
255
+
256
+ if LC_ALL=C free | grep -q -i available; then
257
+ ram_avail_mb=$(($(LC_ALL=C free | grep -i Mem: | tr -s '[:blank:]' ' ' | cut -d ' ' -f 7) / 1024))
258
+ else
259
+ ram_avail_mb=$(($(LC_ALL=C free | grep -i Mem: | tr -s '[:blank:]' ' ' | cut -d ' ' -f 4) / 1024))
260
+ fi
261
+ ;;
262
+
263
+ FreeBSD)
264
+ MAKE=gmake
265
+ if [ -z "${TESTDB_DIR:-}" ]; then
266
+ for old_test_dir in $(ls -d /tmp/mdbx-test.[0-9]* 2>/dev/null); do
267
+ umount $old_test_dir && rm -r $old_test_dir
268
+ done
269
+ TESTDB_DIR="/tmp/mdbx-test.$$"
270
+ rm -rf $TESTDB_DIR && mkdir -p $TESTDB_DIR
271
+ WANNA_MOUNT=1
272
+ else
273
+ mkdir -p $TESTDB_DIR && rm -f $TESTDB_DIR/*
274
+ fi
275
+ ram_avail_mb=$(($(LC_ALL=C vmstat -s | grep -ie '[0-9] pages free$' | cut -d p -f 1) * ($(LC_ALL=C vmstat -s | grep -ie '[0-9] bytes per page$' | cut -d b -f 1) / 1024) / 1024))
276
+ ;;
277
+
278
+ Darwin)
279
+ MAKE=make
280
+ if [ -z "${TESTDB_DIR:-}" ]; then
281
+ for vol in $(ls -d /Volumes/mdx[0-9]*[0-9]tst 2>/dev/null); do
282
+ disk=$(mount | grep $vol | cut -d ' ' -f 1)
283
+ echo "umount: volume $vol disk $disk"
284
+ hdiutil unmount $vol -force
285
+ hdiutil detach $disk
286
+ done
287
+ TESTDB_DIR="/Volumes/mdx$$tst"
288
+ WANNA_MOUNT=1
289
+ else
290
+ mkdir -p $TESTDB_DIR && rm -f $TESTDB_DIR/*
291
+ fi
292
+ pagesize=$(($(LC_ALL=C vm_stat | grep -o 'page size of [0-9]\+ bytes' | cut -d' ' -f 4) / 1024))
293
+ freepages=$(LC_ALL=C vm_stat | grep '^Pages free:' | grep -o '[0-9]\+\.$' | cut -d'.' -f 1)
294
+ ram_avail_mb=$((pagesize * freepages / 1024))
295
+ echo "pagesize ${pagesize}K, freepages ${freepages}, ram_avail_mb ${ram_avail_mb}"
296
+ ;;
297
+
298
+ MSYS*|MINGW*)
299
+ if [ -z "${TESTDB_DIR:-}" ]; then
300
+ for old_test_dir in $(ls -d /tmp/mdbx-test.[0-9]* 2>/dev/null); do
301
+ rm -rf $old_test_dir
302
+ done
303
+ TESTDB_DIR="/tmp/mdbx-test.$$"
304
+ fi
305
+ mkdir -p $TESTDB_DIR && rm -f $TESTDB_DIR/*
306
+
307
+ echo "FIXME: Fake support for ${UNAME}"
308
+ ram_avail_mb=32768
309
+ ;;
310
+
311
+ *)
312
+ echo "FIXME: ${UNAME} not supported by this script"
313
+ exit 2
314
+ ;;
315
+ esac
316
+
317
+ ulimit -c unlimited || echo "failed set unlimited core-dump size" >&2
318
+ rm -f ${TESTDB_DIR}/*
319
+
320
+ ###############################################################################
321
+ # 2. estimate reasonable RAM space for test-db
322
+
323
+ echo "=== ${ram_avail_mb}M RAM available"
324
+ if [ $DONT_CHECK_RAM = yes ]; then
325
+ db_size_mb=$DB_UPTO_MB
326
+ ram_reserve4logs_mb=64
327
+ else
328
+ ram_reserve4logs_mb=1234
329
+ if [ $ram_avail_mb -lt $ram_reserve4logs_mb ]; then
330
+ echo "=== At least ${ram_reserve4logs_mb}Mb RAM required"
331
+ exit 3
332
+ fi
333
+
334
+ #
335
+ # В режимах отличных от MDBX_WRITEMAP изменения до записи в файл
336
+ # будут накапливаться в памяти, что может потребовать свободной
337
+ # памяти размером с БД. Кроме этого, в тест входит сценарий
338
+ # создания копия БД на ходу. Поэтому БД не может быть больше 1/3
339
+ # от доступной памяти. Однако, следует учесть что malloc() будет
340
+ # не сразу возвращать выделенную память системе, а также
341
+ # предусмотреть места для логов.
342
+ #
343
+ # In non-MDBX_WRITEMAP modes, updates (dirty pages) will
344
+ # accumulate in memory before writing to the disk, which may
345
+ # require a free memory up to the size of a whole database. In
346
+ # addition, the test includes a script create a copy of the
347
+ # database on the go. Therefore, the database cannot be more 1/3
348
+ # of available memory. Moreover, should be taken into account
349
+ # that malloc() will not return the allocated memory to the
350
+ # system immediately, as well some space is required for logs.
351
+ #
352
+ db_size_mb=$(((ram_avail_mb - ram_reserve4logs_mb) / 4))
353
+ if [ $db_size_mb -gt $DB_UPTO_MB ]; then
354
+ db_size_mb=$DB_UPTO_MB
355
+ fi
356
+ fi
357
+ echo "=== use ${db_size_mb}M for DB"
358
+
359
+ ###############################################################################
360
+ # 3. Create test-directory in ramfs/tmpfs, i.e. create/format/mount if required
361
+ case ${UNAME} in
362
+ Linux)
363
+ ulimit -c unlimited
364
+ if [ "$(cat /proc/sys/kernel/core_pattern)" != "core.%p" ]; then
365
+ echo "core.%p > /proc/sys/kernel/core_pattern" >&2
366
+ if [ $(id -u) -ne 0 -a -n "$(which sudo 2>/dev/null)" ]; then
367
+ echo "core.%p" | sudo tee /proc/sys/kernel/core_pattern || true
368
+ else
369
+ (echo "core.%p" > /proc/sys/kernel/core_pattern) || true
370
+ fi
371
+ fi
372
+ ;;
373
+
374
+ FreeBSD)
375
+ if [[ WANNA_MOUNT ]]; then
376
+ mount -t tmpfs tmpfs $TESTDB_DIR
377
+ fi
378
+ ;;
379
+
380
+ Darwin)
381
+ if [[ WANNA_MOUNT ]]; then
382
+ ramdisk_size_mb=$((42 + db_size_mb * 2 + ram_reserve4logs_mb))
383
+ number_of_sectors=$((ramdisk_size_mb * 2048))
384
+ ramdev=$(hdiutil attach -nomount ram://${number_of_sectors})
385
+ diskutil erasevolume ExFAT "mdx$$tst" ${ramdev}
386
+ fi
387
+ ;;
388
+
389
+ MSYS*|MINGW*)
390
+ echo "FIXME: Fake support for ${UNAME}"
391
+ ;;
392
+
393
+ *)
394
+ echo "FIXME: ${UNAME} not supported by this script"
395
+ exit 2
396
+ ;;
397
+ esac
398
+
399
+ ###############################################################################
400
+ # 4. build the test executables
401
+
402
+ if [ "$SKIP_MAKE" != "yes" ]; then
403
+ ${MAKE} -j$(which nproc >/dev/null 2>/dev/null && nproc || echo 2) build-test
404
+ fi
405
+
406
+ ###############################################################################
407
+ # 5. internal preparations
408
+
409
+ if which setsid >/dev/null 2>/dev/null; then
410
+ SETSID=$(which setsid)
411
+ else
412
+ SETSID=""
413
+ fi
414
+
415
+ if which lz4 >/dev/null; then
416
+ function logger {
417
+ ${SETSID} lz4 -z -c > ${TESTDB_DIR}/long.log.lz4 || echo "FAILED 'lz4 -z -c > ${TESTDB_DIR}/long.log.lz4'" >&2
418
+ }
419
+ function taillog {
420
+ if [ -s ${TESTDB_DIR}/long.log.lz4 ]; then
421
+ echo "=============================================== last ${TAILLOG} lines"
422
+ lz4 -d -c ${TESTDB_DIR}/long.log.lz4 | tail -n ${TAILLOG}
423
+ else
424
+ echo "=============================================== no test log"
425
+ fi
426
+ }
427
+ elif which gzip >/dev/null; then
428
+ function logger {
429
+ ${SETSID} gzip -c -k > ${TESTDB_DIR}/long.log.gz || echo "FAILED 'gzip -c -k > ${TESTDB_DIR}/long.log.gz'" >&2
430
+ }
431
+ function taillog {
432
+ if [ -s ${TESTDB_DIR}/long.log.gz ]; then
433
+ echo "=============================================== last ${TAILLOG} lines"
434
+ gzip -d -c ${TESTDB_DIR}/long.log.gz | tail -n ${TAILLOG}
435
+ else
436
+ echo "=============================================== no test log"
437
+ fi
438
+ }
439
+ else
440
+ function logger {
441
+ cat > ${TESTDB_DIR}/long.log || echo "FAILED 'cat > ${TESTDB_DIR}/long.log'" >&2
442
+ }
443
+ function taillog {
444
+ if [ -s ${TESTDB_DIR}/long.log ]; then
445
+ echo "=============================================== last ${TAILLOG} lines"
446
+ tail -n ${TAILLOG} ${TESTDB_DIR}/long.log
447
+ else
448
+ echo "=============================================== no test log"
449
+ fi
450
+ }
451
+ fi
452
+
453
+ if [ "$EXTRA" != "no" ]; then
454
+ options=(perturb nomeminit nordahead writemap lifo nostickythreads validation)
455
+ else
456
+ options=(writemap lifo nostickythreads)
457
+ fi
458
+ syncmodes=("" ,+nosync-safe ,+nosync-utterly ,+nometasync)
459
+ function join { local IFS="$1"; shift; echo "$*"; }
460
+
461
+ function bits2options {
462
+ local bits=$1
463
+ local i
464
+ local list=()
465
+ for ((i = 0; i < ${#options[@]}; ++i)); do
466
+ list[$i]=$( (( (bits & (1 << i)) != 0 )) && echo -n '+' || echo -n '-'; echo ${options[$i]})
467
+ done
468
+ join , ${list[@]}
469
+ }
470
+
471
+ LFD=0
472
+ trap "echo 'SIGPIPE(ignored)'" SIGPIPE
473
+
474
+ function failed {
475
+ set +euo pipefail
476
+ echo "FAILED" >&2
477
+ if [ ${LFD} -ne 0 ]; then
478
+ sleep 0.05
479
+ echo "@@@ END-OF-LOG/FAILED" >&${LFD}
480
+ sleep 0.05
481
+ exec {LFD}>&-
482
+ LFD=0
483
+ fi
484
+ if [ ${TAILLOG} -gt 0 ]; then
485
+ taillog
486
+ fi
487
+ exit 1
488
+ }
489
+
490
+ function on_exit {
491
+ set +euo pipefail
492
+ if [ ${LFD} -ne 0 ]; then
493
+ sleep 0.05
494
+ echo "@@@ END-OF-LOG/EXIT" >&${LFD}
495
+ sleep 0.05
496
+ exec {LFD}>&-
497
+ LFD=0
498
+ fi
499
+ echo "--- EXIT" >&2
500
+ }
501
+ trap on_exit EXIT
502
+
503
+ function probe {
504
+ echo "----------------------------------------------- $(date)"
505
+ echo "PROBE №${caption}"
506
+ rm -f ${TESTDB_DIR}/* || failed
507
+ for case in $LIST
508
+ do
509
+ echo "${speculum} --random-writemap=no --ignore-dbfull --repeat=${REPEAT} --pathname=${TESTDB_DIR}/long.db --cleanup-after=no --geometry-jitter=${GEOMETRY_JITTER} $@ $case"
510
+ if [[ ${REPORT_DEPTH} = "yes" && ($case = "basic" || $case = "--hill") ]]; then
511
+ if [ -z "${TEE4PIPE:-}" ]; then
512
+ TEE4PIPE=$(tee --help | grep -q ' -p' && echo "tee -i -p" || echo "tee -i")
513
+ fi
514
+ exec {LFD}> >(${TEE4PIPE} >(logger) | grep -e reach -e achieve)
515
+ else
516
+ exec {LFD}> >(logger)
517
+ fi
518
+ ${NUMABIND} ${MONITOR} ./mdbx_test ${speculum} --random-writemap=no --ignore-dbfull --repeat=${REPEAT} --pathname=${TESTDB_DIR}/long.db --cleanup-after=no --geometry-jitter=${GEOMETRY_JITTER} "$@" $case >&${LFD} \
519
+ && ${NUMABIND} ${MONITOR} ./mdbx_chk -q ${TESTDB_DIR}/long.db | tee ${TESTDB_DIR}/long-chk.log \
520
+ && ([ ! -e ${TESTDB_DIR}/long.db-copy ] || ${NUMABIND} ${MONITOR} ./mdbx_chk -q ${TESTDB_DIR}/long.db-copy | tee ${TESTDB_DIR}/long-chk-copy.log) \
521
+ || failed
522
+ if [ ${LFD} -ne 0 ]; then
523
+ echo "@@@ END-OF-LOG/ITERATION" >&${LFD}
524
+ exec {LFD}>&-
525
+ LFD=0
526
+ fi
527
+ done
528
+ }
529
+
530
+ # generate caseset
531
+ declare -A caseset_id2caption
532
+ declare -A caseset_id2args
533
+ cases=0
534
+ for ((bits=2**${#options[@]}; --bits >= 0; )); do
535
+
536
+ split=30
537
+ cases=$((++cases))
538
+ caseset_id2caption[${cases}]="int-key,with-dups, split=${split}"
539
+ caseset_id2args[${cases}]="--table=+key.integer,+data.multi --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=max --mode=$(bits2options $bits)${syncmodes[cases%4]}"
540
+ cases=$((++cases))
541
+ caseset_id2caption[${cases}]="int-key,int-data, split=${split}"
542
+ caseset_id2args[${cases}]="--table=+key.integer,+data.integer --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=max --mode=$(bits2options $bits)${syncmodes[cases%4]}"
543
+ cases=$((++cases))
544
+ caseset_id2caption[${cases}]="with-dups, split=${split}"
545
+ caseset_id2args[${cases}]="--table=+data.multi --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=max --mode=$(bits2options $bits)${syncmodes[cases%4]}"
546
+ cases=$((++cases))
547
+ caseset_id2caption[${cases}]="int-key,fixdups, split=${split}"
548
+ caseset_id2args[${cases}]="--table=+key.integer,+data.fixed --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen=rnd --mode=$(bits2options $bits)${syncmodes[cases%4]}"
549
+ cases=$((++cases))
550
+ caseset_id2caption[${cases}]="fixdups, split=${split}"
551
+ caseset_id2args[${cases}]="--table=+data.fixed --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen=rnd --mode=$(bits2options $bits)${syncmodes[cases%4]}"
552
+
553
+ split=24
554
+ cases=$((++cases))
555
+ caseset_id2caption[${cases}]="int-key,with-dups, split=${split}"
556
+ caseset_id2args[${cases}]="--table=+key.integer,+data.multi --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=max --mode=$(bits2options $bits)${syncmodes[cases%4]}"
557
+ cases=$((++cases))
558
+ caseset_id2caption[${cases}]="int-key,int-data, split=${split}"
559
+ caseset_id2args[${cases}]="--table=+key.integer,+data.integer --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=max --mode=$(bits2options $bits)${syncmodes[cases%4]}"
560
+ cases=$((++cases))
561
+ caseset_id2caption[${cases}]="with-dups, split=${split}"
562
+ caseset_id2args[${cases}]="--table=+data.multi --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=max --mode=$(bits2options $bits)${syncmodes[cases%4]}"
563
+ cases=$((++cases))
564
+ caseset_id2caption[${cases}]="int-key,fixdups, split=${split}"
565
+ caseset_id2args[${cases}]="--table=+key.integer,+data.fixed --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen=rnd --mode=$(bits2options $bits)${syncmodes[cases%4]}"
566
+ cases=$((++cases))
567
+ caseset_id2caption[${cases}]="fixdups, split=${split}"
568
+ caseset_id2args[${cases}]="--table=+data.fixed --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen=rnd --mode=$(bits2options $bits)${syncmodes[cases%4]}"
569
+
570
+ split=16
571
+ cases=$((++cases))
572
+ caseset_id2caption[${cases}]="int-key,w/o-dups, split=${split}"
573
+ caseset_id2args[${cases}]="--table=+key.integer,-data.multi --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=1111 --mode=$(bits2options $bits)${syncmodes[cases%4]}"
574
+ cases=$((++cases))
575
+ caseset_id2caption[${cases}]="int-key,with-dups, split=${split}"
576
+ caseset_id2args[${cases}]="--table=+key.integer,+data.multi --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=max --mode=$(bits2options $bits)${syncmodes[cases%4]}"
577
+ cases=$((++cases))
578
+ caseset_id2caption[${cases}]="int-key,int-data, split=${split}"
579
+ caseset_id2args[${cases}]="--table=+key.integer,+data.integer --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=max --mode=$(bits2options $bits)${syncmodes[cases%4]}"
580
+ cases=$((++cases))
581
+ caseset_id2caption[${cases}]="w/o-dups, split=${split}"
582
+ caseset_id2args[${cases}]="--table=-data.multi --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=1111 --mode=$(bits2options $bits)${syncmodes[cases%4]}"
583
+ cases=$((++cases))
584
+ caseset_id2caption[${cases}]="with-dups, split=${split}"
585
+ caseset_id2args[${cases}]="--table=+data.multi --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=max --mode=$(bits2options $bits)${syncmodes[cases%4]}"
586
+ cases=$((++cases))
587
+ caseset_id2caption[${cases}]="int-key,fixdups, split=${split}"
588
+ caseset_id2args[${cases}]="--table=+key.integer,+data.fixed --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen=rnd --mode=$(bits2options $bits)${syncmodes[cases%4]}"
589
+ cases=$((++cases))
590
+ caseset_id2caption[${cases}]="fixdups, split=${split}"
591
+ caseset_id2args[${cases}]="--table=+data.fixed --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen=rnd --mode=$(bits2options $bits)${syncmodes[cases%4]}"
592
+
593
+ if [ "$EXTRA" != "no" ]; then
594
+ split=10
595
+ cases=$((++cases))
596
+ caseset_id2caption[${cases}]="int-key,w/o-dups, split=${split}"
597
+ caseset_id2args[${cases}]="--table=+key.integer,-data.multi --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=1111 --mode=$(bits2options $bits)${syncmodes[cases%4]}"
598
+ cases=$((++cases))
599
+ caseset_id2caption[${cases}]="int-key,with-dups, split=${split}"
600
+ caseset_id2args[${cases}]="--table=+key.integer,+data.multi --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=max --mode=$(bits2options $bits)${syncmodes[cases%4]}"
601
+ cases=$((++cases))
602
+ caseset_id2caption[${cases}]="int-key,int-data, split=${split}"
603
+ caseset_id2args[${cases}]="--table=+key.integer,+data.integer --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=max --mode=$(bits2options $bits)${syncmodes[cases%4]}"
604
+ cases=$((++cases))
605
+ caseset_id2caption[${cases}]="w/o-dups, split=${split}"
606
+ caseset_id2args[${cases}]="--table=-data.multi --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=1111 --mode=$(bits2options $bits)${syncmodes[cases%4]}"
607
+ cases=$((++cases))
608
+ caseset_id2caption[${cases}]="with-dups, split=${split}"
609
+ caseset_id2args[${cases}]="--table=+data.multi --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=max --mode=$(bits2options $bits)${syncmodes[cases%4]}"
610
+ cases=$((++cases))
611
+ caseset_id2caption[${cases}]="int-key,fixdups, split=${split}"
612
+ caseset_id2args[${cases}]="--table=+key.integer,+data.fixed --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen=rnd --mode=$(bits2options $bits)${syncmodes[cases%4]}"
613
+ cases=$((++cases))
614
+ caseset_id2caption[${cases}]="fixdups, split=${split}"
615
+ caseset_id2args[${cases}]="--table=+data.fixed --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen=rnd --mode=$(bits2options $bits)${syncmodes[cases%4]}"
616
+ fi
617
+
618
+ split=4
619
+ cases=$((++cases))
620
+ caseset_id2caption[${cases}]="int-key,w/o-dups, split=${split}"
621
+ caseset_id2args[${cases}]="--table=+key.integer,-data.multi --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=1111 --mode=$(bits2options $bits)${syncmodes[cases%4]}"
622
+ cases=$((++cases))
623
+ caseset_id2caption[${cases}]="int-key,int-data, split=${split}"
624
+ caseset_id2args[${cases}]="--table=+key.integer,+data.integer --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=max --mode=$(bits2options $bits)${syncmodes[cases%4]}"
625
+ cases=$((++cases))
626
+ caseset_id2caption[${cases}]="w/o-dups, split=${split}"
627
+ caseset_id2args[${cases}]="--table=-data.multi --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=1111 --mode=$(bits2options $bits)${syncmodes[cases%4]}"
628
+ cases=$((++cases))
629
+ caseset_id2caption[${cases}]="int-key,fixdups, split=${split}"
630
+ caseset_id2args[${cases}]="--table=+key.integer,+data.fixed --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen=rnd --mode=$(bits2options $bits)${syncmodes[cases%4]}"
631
+ cases=$((++cases))
632
+ caseset_id2caption[${cases}]="fixdups, split=${split}"
633
+ caseset_id2args[${cases}]="--table=+data.fixed --keygen.split=${split} --keylen.min=min --keylen.max=max --datalen=rnd --mode=$(bits2options $bits)${syncmodes[cases%4]}"
634
+ done
635
+
636
+ ###############################################################################
637
+ # 6. run stochastic iterations
638
+
639
+ function pass {
640
+ for ((round=1; round <= ROUNDS; ++round)); do
641
+ echo "======================================================================="
642
+ if [[ $ROUNDS > 1 ]]; then
643
+ ${BANNER} "$nops / $wbatch / round $round of $ROUNDS"
644
+ else
645
+ ${BANNER} "$nops / $wbatch"
646
+ fi
647
+
648
+ seed=$(($(date +%s) + RANDOM))
649
+ subcase=0
650
+ for id in $(seq 1 ${cases} | shuf); do
651
+ caption="$((++count)) ${caseset_id2caption[${id}]}, case $((++subcase))/${id} of ${cases}" probe \
652
+ --prng-seed=${seed} --pagesize=$PAGESIZE --size-upper-upto=${db_size_mb}M ${caseset_id2args[${id}]} --nops=$nops --batch.write=$wbatch
653
+ done
654
+ done
655
+ }
656
+
657
+ if [ "$DELAY" != "0" ]; then
658
+ sleep $DELAY
659
+ fi
660
+
661
+ count=0
662
+ loop=0
663
+ if [[ $SMALL != "yes" ]]; then
664
+ for nops in 10 33 100 333 1000 3333 10000 33333 100000 333333 1000000 3333333 10000000 33333333 100000000 333333333 1000000000; do
665
+ if [ $nops -lt $FROM ]; then continue; fi
666
+ if [ $nops -gt $UPTO ]; then echo "The '--upto $UPTO' limit reached"; break; fi
667
+ if [ -n "$LOOPS" ] && [ $loop -ge "$LOOPS" ]; then echo "The '--loops $LOOPS' limit reached"; break; fi
668
+ echo "======================================================================="
669
+ wbatch=$((nops / 7 + 1))
670
+ speculum=$([ $nops -le 1000 ] && echo '--speculum' || true)
671
+ while true; do
672
+ pass
673
+ loop=$((loop + 1))
674
+ if [ -n "$LOOPS" ] && [ $loop -ge "$LOOPS" ]; then break; fi
675
+ wbatch=$(((wbatch > 7) ? wbatch / 7 : 1))
676
+ if [ $wbatch -eq 1 -o $((nops / wbatch)) -gt 1000 ]; then break; fi
677
+ done # batch (write-ops per txn)
678
+ done # n-ops
679
+ else
680
+ for ((wbatch=FROM; wbatch<=UPTO; ++wbatch)); do
681
+ if [ -n "$LOOPS" ] && [ $loop -ge "$LOOPS" ]; then echo "The '--loops $LOOPS' limit reached"; break; fi
682
+ echo "======================================================================="
683
+ speculum=$([ $wbatch -le 1000 ] && echo '--speculum' || true)
684
+ nops=$((wbatch / 7 + 1))
685
+ pass
686
+ loop=$((loop + 1))
687
+ done # wbatch
688
+ fi
689
+
690
+ echo "=== ALL DONE ====================== $(date)"