mdbx-test: add '--keygen.zefofill=NO' option.

Change-Id: Iec45ab7a79846acc66cb034000ff3c146921e02a
This commit is contained in:
Leonid Yuriev 2020-05-25 02:25:24 +03:00
parent 2c8f115400
commit 782429487f
6 changed files with 43 additions and 12 deletions

View File

@ -395,6 +395,8 @@ void dump(const char *title) {
i->params.keygen.split,
i->params.keygen.width - i->params.keygen.split);
log_verbose("keygen.seed: %u\n", i->params.keygen.seed);
log_verbose("keygen.zerofill: %s\n",
i->params.keygen.zero_fill ? "Yes" : "No");
log_verbose("key: minlen %u, maxlen %u\n", i->params.keylen_min,
i->params.keylen_max);
log_verbose("data: minlen %u, maxlen %u\n", i->params.datalen_min,

View File

@ -231,6 +231,7 @@ struct keygen_params_pod {
uint32_t seed{0};
uint64_t offset{0};
keygen_case keycase{kc_random};
bool zero_fill{false};
};
struct actor_params_pod {

View File

@ -78,9 +78,11 @@ void __hot maker::pair(serial_t serial, const buffer &key, buffer &value,
assert(mapping.mesh <= mapping.width);
assert(mapping.rotate <= mapping.width);
assert(mapping.offset <= mask(mapping.width));
assert(!(key_essentials.flags &
~(MDBX_INTEGERKEY | MDBX_REVERSEKEY | MDBX_DUPSORT)));
assert(!(value_essentials.flags & ~(MDBX_INTEGERDUP | MDBX_REVERSEDUP)));
assert(
!(key_essentials.flags & ~(essentials::prng_fill_flag | MDBX_INTEGERKEY |
MDBX_REVERSEKEY | MDBX_DUPSORT)));
assert(!(value_essentials.flags &
~(essentials::prng_fill_flag | MDBX_INTEGERDUP | MDBX_REVERSEDUP)));
log_trace("keygen-pair: serial %" PRIu64 ", data-age %" PRIu64, serial,
value_age);
@ -213,6 +215,11 @@ void maker::setup(const config::actor_params_pod &actor, unsigned actor_id,
(uint32_t)actor.datalen_max,
(uint32_t)mdbx_limits_valsize_max(actor.pagesize, key_essentials.flags));
if (!actor.keygen.zero_fill) {
key_essentials.flags |= essentials::prng_fill_flag;
value_essentials.flags |= essentials::prng_fill_flag;
}
(void)thread_number;
mapping = actor.keygen;
salt = (actor.keygen.seed + actor_id) * UINT64_C(14653293970879851569);
@ -298,6 +305,10 @@ void __hot maker::mk_begin(const serial_t serial, const essentials &params,
void __hot maker::mk_continue(const serial_t serial, const essentials &params,
result &out) {
static_assert((essentials::prng_fill_flag &
(MDBX_DUPSORT | MDBX_DUPFIXED | MDBX_INTEGERKEY |
MDBX_INTEGERDUP | MDBX_REVERSEKEY | MDBX_REVERSEDUP)) == 0,
"WTF?");
out.value.iov_base = out.bytes;
if (params.flags & (MDBX_INTEGERKEY | MDBX_INTEGERDUP)) {
assert(params.maxlen == params.minlen);
@ -308,7 +319,11 @@ void __hot maker::mk_continue(const serial_t serial, const essentials &params,
out.u32 = (uint32_t)serial;
} else if (params.flags & (MDBX_REVERSEKEY | MDBX_REVERSEDUP)) {
if (out.value.iov_len > 8) {
memset(out.bytes, '\0', out.value.iov_len - 8);
if (params.flags & essentials::prng_fill_flag) {
uint64_t state = serial ^ UINT64_C(0x41803711c9b75f19);
prng_fill(state, out.bytes, out.value.iov_len - 8);
} else
memset(out.bytes, '\0', out.value.iov_len - 8);
unaligned::store(out.bytes + out.value.iov_len - 8, htobe64(serial));
} else {
out.u64 = htobe64(serial);
@ -317,8 +332,13 @@ void __hot maker::mk_continue(const serial_t serial, const essentials &params,
}
} else {
out.u64 = htole64(serial);
if (out.value.iov_len > 8)
memset(out.bytes + 8, '\0', out.value.iov_len - 8);
if (out.value.iov_len > 8) {
if (params.flags & essentials::prng_fill_flag) {
uint64_t state = serial ^ UINT64_C(0x923ab47b7ee6f6e4);
prng_fill(state, out.bytes + 8, out.value.iov_len - 8);
} else
memset(out.bytes + 8, '\0', out.value.iov_len - 8);
}
}
assert(out.value.iov_len >= params.minlen);

View File

@ -108,6 +108,7 @@ class maker {
struct essentials {
uint16_t minlen{0};
enum { prng_fill_flag = 1 };
uint16_t flags{0};
uint32_t maxlen{0};
} key_essentials, value_essentials;

View File

@ -81,6 +81,7 @@ void __noreturn usage(void) {
" --keygen.width=N TBD (see the source code)\n"
" --keygen.mesh=N TBD (see the source code)\n"
" --keygen.seed=N TBD (see the source code)\n"
" --keygen.zerofill=yes|NO TBD (see the source code)\n"
" --keygen.split=N TBD (see the source code)\n"
" --keygen.rotate=N TBD (see the source code)\n"
" --keygen.offset=N TBD (see the source code)\n"
@ -136,6 +137,7 @@ void actor_params::set_defaults(const std::string &tmpdir) {
pagesize = -1;
keygen.seed = 1;
keygen.zero_fill = false;
keygen.keycase = kc_random;
keygen.width = (table_flags & MDBX_DUPSORT) ? 32 : 64;
keygen.mesh = keygen.width;
@ -329,6 +331,9 @@ int main(int argc, char *const argv[]) {
if (config::parse_option(argc, argv, narg, "keygen.seed",
params.keygen.seed, config::no_scale))
continue;
if (config::parse_option(argc, argv, narg, "keygen.zerofill",
params.keygen.zero_fill))
continue;
if (config::parse_option(argc, argv, narg, "keygen.split",
params.keygen.split, 1, 64))
continue;

View File

@ -265,22 +265,24 @@ uint32_t prng32(uint64_t &state) {
}
void prng_fill(uint64_t &state, void *ptr, size_t bytes) {
uint32_t u32 = prng32(state);
while (bytes >= 4) {
*((uint32_t *)ptr) = prng32(state);
memcpy(ptr, &u32, 4);
ptr = (uint32_t *)ptr + 1;
bytes -= 4;
u32 = prng32(state);
}
switch (bytes & 3) {
case 3: {
uint32_t u32 = prng32(state);
case 3:
memcpy(ptr, &u32, 3);
} break;
break;
case 2:
*((uint16_t *)ptr) = (uint16_t)prng32(state);
memcpy(ptr, &u32, 2);
break;
case 1:
*((uint8_t *)ptr) = (uint8_t)prng32(state);
memcpy(ptr, &u32, 1);
break;
case 0:
break;